指定した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で表示可能 ↩︎

関連記事


  1. クエリパラメータを使ってお手軽にGitHubのプルリクを作成する
  2. 他の人には読めない形式でGitHubのSecretsの値を読み出す
  3. GitHub Actionsでプルリクのコメントに複数行テキストを投稿する
  4. GitHub Actionsでエラーの時だけ特定の処理を実行する
  5. Tera Termのマクロで、パスワードを扱う操作を自動化する
  6. HugoテンプレートをOGPやTwitter Cardsに対応する
  7. 既存コードへのCheckstyle導入におけるルールの選定

comments powered by Disqus