Gitのfilter-branchコマンドは強力ですが、たとえば修正する著者が複数いる場合など、些細でないものに使用するのは恐ろしく扱いにくいです。
git-shortlogのマンページで説明されている.mailmap機能を使用する便利な代替手段を次に示します。これにより、gitログのフォーマット機能で使用できる著者マッピングメカニズムが提供されます。これを使用して、コミットの名前付きシーケンスを選択および修正するコマンドを生成できます。
たとえば、ブランチ$ BRANCHのオーサーシップを修正し、コミット$ STARTで開始するとします。
リポジトリの最上位ディレクトリに.mailmapファイルを作成する必要があります。このファイルは、既存の著者名を正しい名前にマッピングします。既存の著者名のリストを取得するには:
git shortlog -se
このような.mailmapファイルで終わる必要があります(たとえば):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
git logのフォーマット機能を使用して、$ BRANCHを$ BRANCH2に書き換えるコマンドを生成できます。
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
最初のコマンドは、コミット$ STARTから新しい空のブランチを作成します。$ STARTから$ BRANCHの終わりまでの各コミットに対して、2番目のコマンドcherryは、現在のブランチ$ BRANCH2の終わりに元のコミットを選択し、それを修正して作成者を正しく設定します。
これも一般的に適用可能です-これを〜/ .gitconfigに入れてください:
[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" '
したがって、著者を修正する必要がある場合は、.mapfileを生成して次の操作を行う必要があります。
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
元のブランチ参照を新しいものに再割り当てし、新しいものを削除できます。
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
これに似た目的での使用についての質問は、Stack Overflowでより適切に尋ねられます。