Perintah cabang-filter Git sangat kuat, tetapi sangat sulit digunakan untuk hal-hal yang tidak sepele, seperti misalnya, jika Anda memiliki lebih dari satu penulis yang harus dikoreksi.
Inilah alternatif yang menurut saya berguna, yang menggunakan fitur .mailmap yang dijelaskan dalam halaman git-shortlog. Ini menyediakan mekanisme pemetaan penulis yang dapat kita gunakan dengan fasilitas pemformatan git log. Kita dapat menggunakannya untuk menghasilkan perintah untuk memilih dan mengubah mengubah urutan komit.
Sebagai contoh, misalkan Anda ingin memperbaiki kepengarangan pada cabang $ CABANG, mulai dari $ MULAI komit.
Anda perlu membuat file .mailmap di direktori teratas repositori Anda yang memetakan nama penulis yang sudah ada untuk mengoreksi. Anda bisa mendapatkan daftar nama penulis yang ada dengan:
git shortlog -se
Anda harus memiliki file .mailmap seperti ini (misalnya):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Sekarang Anda dapat menggunakan fitur pemformatan git log untuk menghasilkan perintah untuk menulis ulang $ BRANCH sebagai $ BRANCH2.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
Perintah pertama membuat cabang kosong baru yang tumbuh dari komit $ MULAI. Untuk setiap komit antara $ MULAI dan kemudian akhir dari $ CABANG, perintah kedua cherry mengambil komit asli ke akhir cabang saat ini $ CABANG2, dan mengubah itu untuk mengatur penulis dengan benar.
Ini juga berlaku secara umum - letakkan ini di ~ / .gitconfig Anda:
[alias]
# git reauthor $START..$END
reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H && git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '
Jadi ketika Anda perlu memperbaiki penulis, sekarang Anda hanya perlu menghasilkan .mapfile dan lakukan:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
Ref cabang asli dapat dipindahkan ke yang baru, dan yang baru dihapus:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
untuk tujuan yang serupa dengan ini lebih baik ditanyakan pada Stack Overflow .