メインコンテンツへスキップ
kt-tech.blog

【Github】コミットの一括変更で草を生やす方法

技術3分で読めます

この記事でわかること

  • GitHub の草がある日突然消える原因(コミットのメールアドレスとアカウントの紐づきが外れる)
  • filter-branch で全コミットの author / committer を一括変更して草を復活させる手順
  • この操作をやっていいリポジトリと、絶対にやってはいけないリポジトリの境界

Git が使えること。履歴を書き換えて強制 push するので、自分しか clone していない個人リポジトリであることが前提です。

概要

この記事ではコミットを一括変更して草を生やしなおす方法について説明します。

ある日突然、毎日生やしていた草が消えてしまったことがありその時に調べたことを備忘録的に残しておこうと思います。

事件

自分の趣味は毎日Githubに草を生やすことでした。

しかしある日一部の草が突然消えてしまっていることに気づきました。

原因

原因は、いくつか登録しているemailの中で最近使っていないemailを削除したことでした。

GitHub の草は、コミットに入っているメールアドレスがアカウントに登録されているものと一致して初めて自分のものとして数えられます。つまり、過去のコミットはそのままなのに、紐づけ先のメールアドレスを外した瞬間に過去分まとめてノーカウントになるというわけです。

参考: GitHub の草が消えたときの対処(zw-kakeru)

解決方法

filter-branchを使い履歴の一括変更をした後、force pushを行うことで解決しました。

Bash
git filter-branch -f --env-filter "GIT_AUTHOR_NAME=GitHubのアカウント名; GIT_AUTHOR_EMAIL=GitHubのメールアドレス; GIT_COMMITTER_NAME=GitHubのアカウント名; GIT_COMMITTER_EMAIL=GitHubのメールアドレス;" HEAD
git push -f origin main
重要
これは履歴を丸ごと書き換えて強制 push する操作です。全コミットのハッシュが変わるので、他の人が clone しているリポジトリでやると全員の手元が壊れます。個人のリポジトリ限定で、実行前にバックアップ(git clone --mirror など)を取ってからにしてください。
ポイント
現在の Git では git filter-branch は推奨されていません。実行すると「代わりに git filter-repo を使え」という警告が出ます(遅い・地雷が多いことが理由です)。小さな個人リポジトリなら上の手順でも問題なく動きますが、コミット数が多い場合は pip install git-filter-repo して git filter-repo --mailmap を使うほうが速く安全です。

参考: git filter-branch でコミットの author を一括変更する(Qiita)

おわりに

毎日生やしていた草が突然消えた時は冷や汗をかきました。

多分同じ状況になってしまう方がいらっしゃると思いますので、その方々の助けになれればと思います。

なお、「消えた草を戻す」ではなく「コミットした日付自体をずらしたい」場合は、別記事の コミットの日時を変更して草が生えてる場所をずらす方法 で書いています。

更新履歴

  1. コードブロックの言語指定を javascript から bash に修正し、コピペしやすいようプロンプト記号を削除。履歴書き換えの危険性とバックアップの推奨を警告として明示化。filter-branch が現在は非推奨で filter-repo が推奨されていることを補足(手順自体はそのまま)。草が消える仕組みの説明を追加。裸 URL をタイトル付きリンクに変更。関連記事へのリンクを追加。