指定したCommitのAuthorとCommitterを書き換える

Gitのコミットログから、特定のCommitを書き換えたいという場合の備忘録。
コミットの履歴を改変する危険な操作なので、よく分からない人は使わないこと。

目的

Gitのコミットログに含まれている名前やメールアドレスを書き換えたくなる場合がある。
具体的にありそうなのは以下のようなケース。

  • アカウントを間違えてcommitしてしまった
  • GitHubに登録しているメールアドレスを変更したけど、過去のコミットログに含まれているアドレスを変えたい
  • コミットのログに公開したくない名前やメールアドレスが含まれているため、書き換えたい

なお、通常GitのコミットログにはAuthorが表示されるが、Committerも記録されている。1
したがって、書き換える際にはこれらを双方とも書き換える必要がある。

方法

git filter-branchを使用する。
以下のように実行することで、<commit_id>のコミットのみを対象に、名前やメールアドレスを書き換えることができる。

git filter-branch --env-filter '
if [ $GIT_COMMIT = "<commit_id>" ]
then
    export GIT_AUTHOR_NAME="hoge"
    export GIT_AUTHOR_EMAIL="fuga@example.com"
    export GIT_COMMITTER_NAME="hoge"
    export GIT_COMMITTER_EMAIL="fuga@example.com"
fi'

なお、シングルクォートの中身はシェルスクリプトになっている。
もしすべてのコミットを対象に書き換える場合は、if文を書かずにexport〜の箇所だけを羅列すればよい。

また、2回以上filter-branchを実行する場合は、forceオプション-fをつけて実行する必要があるので注意。

補足

AuthorやCommitterは以下のコマンドで確認できる。

git log --pretty=full

既にリポジトリに存在する内容を書き換えた場合は、push時にfoceオプションを指定して以下のように実行する必要がある。
これは危険を伴うため、よく分からない場合は絶対に使わないこと。

git push -f

参考


  1. Committerはgit log --pretty=fullで表示可能 [return]

関連記事


  1. Windowsのコマンドラインから7-Zipでtar.gz形式に圧縮する
  2. exampleSiteのローカルサーバ起動やビルドを1行で実行する
  3. Macのzsh上でFn-Deleteが動作しない問題
  4. MavenでOSSのライセンス一覧を出力する
  5. Hugoはじめました
  6. バーコードを生成するJavaサーブレット (Barcode4J)
  7. ExcelのCONFIDENCE関数の罠

comments powered by Disqus