デフォルトでは、git rebaseはコミッターのタイムスタンプを新しいコミットが作成された時刻に設定しますが、作成者のタイムスタンプはそのままにします。ほとんどの場合、これは望ましい動作ですが、一部のシナリオでは、コミッターのタイムスタンプも変更したくありません。どうすればそれを達成できますか?さて、これが私が通常行うトリックです。
最初に、リベースしようとしている各コミットに一意のコミットメッセージと作成者のタイムスタンプがあることを確認します(これはトリックの改善が必要なところですが、現在は私のニーズに合っています)。
リベースする前に、ファイルにリベースされるすべてのコミットのコミッターのタイムスタンプ、作成者のタイムスタンプ、コミットメッセージを記録します。
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
次に、実際のリベースを実行します。
最後に、を使用してコミットメッセージが同じ場合、現在のコミッターのタイムスタンプをファイルに記録されているタイムスタンプに置き換えますgit filter-branch
。
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'
何か問題が発生した場合は、チェックアウトgit reflog
またはすべてのrefs/original/
参照。
さらに、著者のタイムスタンプと同様のことができます。
たとえば、一部のコミットの作成者のタイムスタンプが順不同で、これらのコミットを再配置しない場合、作成者のタイムスタンプを順番に表示したいだけであれば、次のコマンドが役立ちます。
git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog
join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_
mv hashlog_ hashlog
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'