現在、個人用(YotioSoft)と研究室用の2つのGitHubアカウントを併用しているのですが、先日、アカウントの切り替えを忘れてしまい間違えてYotioSoftの公開リポジトリに研究室用のアカウントでcommit、そのままpushしてしまいました。

これの何が厄介かというと、研究室用のアカウント名は本名で登録していて、しかも大学の研究室のE-mailで登録していて、さらに研究室のOrganizationにも参加しているという点です。これで仮にブログやTwitterが炎上して特定でもされれば即身バレ、さらに研究室にも迷惑をかけてしまいます。もちろん普段から炎上しないよう心がけてはいますが、なんにせよ意図しないまま研究室用のアカウントがバレてしまうのはとても嫌ですし危険です。

というわけで、今回はGitHubに間違えて意図しないアカウントでcommit&pushしてしまったときの対処法をまとめます。

現状

まず、最新のコミットの履歴に研究室用のアカウント名がCommitterとして載ってしまっています。

そして、Contributorsにもバッチリと研究室用アカウントの名前、すなわち本名が載ってしまっています。
スクリーンショット 2021-12-06 23-25-182
Contoributorsを非表示にする方法は存在しないので、どうあがいても研究室用のアカウントが未来永劫開示され続けます。しかもこれ、GitHub Pagesで使っているリポジトリなので公開リポジトリにしなければなりません。

対処法

gitの履歴を強制的に書き換えます。ただしこれは非常に危険な行為であり、推奨されていません。下手したらリポジトリがぶっ壊れます。やるなら個人用リポジトリで。チームで開発しているリポジトリの場合は要相談です。

具体的に何をやるかというと、gitのコミット履歴から研究室用アカウントが行ったコミットを個人用アカウントの名前に書き換え、強制的に上書きします。
それを実現するのが以下のコマンド。

$ git filter-branch -f --commit-filter ' \
    if [ "$GIT_COMMITTER_NAME" = "[書き換えたいアカウント名]" ]; then \
        GIT_AUTHOR_NAME="[書き換え後のアカウント名]"; \
        GIT_AUTHOR_EMAIL="[書き換え後のアカウントのメールアドレス]"; \
        GIT_COMMITTER_NAME="[書き換え後のアカウント名]"; \
        GIT_COMMITTER_EMAIL="[書き換え後のメールアドレス]"; \
        git commit-tree "$@"; \
    else \
        git commit-tree "$@"; \
    fi' \
    HEAD

今回の場合はこのようにします。

$ git filter-branch -f --commit-filter ' \
    if [ "$GIT_COMMITTER_NAME" = "[研究室用アカウントのユーザ名]" ]; then \
        GIT_AUTHOR_NAME="YotioSoft"; \
        GIT_AUTHOR_EMAIL="yotiosoft2014@gmail.com"; \
        GIT_COMMITTER_NAME="YotioSoft"; \
        GIT_COMMITTER_EMAIL="yotiosoft2014@gmail.com"; \
        git commit-tree "$@"; \
    else \
        git commit-tree "$@"; \
    fi' \
    HEAD

実行すると最初に警告が表示され、しばらくすると書き換えが始まります。
完了したら、以下のコマンドで強制的に上書きpushします。

$ git push -f

これでpushが完了すれば、GitHubのコミット履歴から研究室用アカウントの名前が消えるはずです。

履歴からは消えたが…

さあ、これでGitHubリポジトリから研究室用アカウントの名前が消えたはず。
スクリーンショット 2021-12-06 23-38-41
お、全部YotioSoftになってる!これで解決か?

と思ったのもつかの間。Contributorsを見てみると、
スクリーンショット 2021-12-06 23-25-1823のコピー
なんでまだ残ってるの…?( ◜◡◝ )

コミット履歴からは完全抹消されているにも関わらず、Contributorsにはまだ研究室用アカウント名が居座っていました。コミット履歴から消えたらもうコントリビューターじゃないはずですが…。
おそらくコミット履歴を上書きしても、GitHubのContoributorsには反映されていないのだと思われます。

Contributorsに反映させる方法

海外にも同様の状況で困っている人がいました。
git- Removing contributor from github.com? - Stack Overflow

上記のリンク先には「GitHubでブランチ名を一旦変更してもとに戻せば反映されるよ」という旨の書き込みがありました。
手順としてはこうです。

  1. GitHubでmasterブランチの名前を適当な別の名前に変える
  2. 再び名前をmasterに戻す

master以外のブランチであれば、そのブランチ名に読み替えてください。最近作られたリポジトリですと、masterではなくmainブランチになっているかと思います。

以下、手順を追って実践してみます。

まずはGitHubでmasterのブランチ名を変更。
スクリーンショット 2021-12-06 23-52-49のコピー
ブランチ一覧を開き、View all branchesをクリックします。

次に、変更するブランチ名の右端にある鉛筆アイコンをクリック。
スクリーンショット 2021-12-06 23-53-17のコピー

ここでブランチ名を書き換えられます。今回は書き換え後のブランチ名をmaster2としましたが、一時的なブランチ名なのでここは何でも良いです。
スクリーンショット 2021-12-06 23-53-30
書き換え後のブランチ名を入力したらRename branchをクリックします。

masterが別の名前に書き換わっていることを確認したら、もう一度ブランチ名を書き換え、masterに戻します。
スクリーンショット 2021-12-06 23-54-01
Rename branchをクリックしたら完了です。

追記(2022/02/14)

また同様の事態が発生してしまったので上記の方法で解決しようとしたのですが、ブランチ名を変えただけではContributorsが更新されませんでした。
その場合は、一旦リポジトリをPublicからPrivateに設定変更して、もう一度Publicに戻すと、Contributorsが更新されました。ご参考までに。

結果

リポジトリのページを見てみると…
スクリーンショット 2021-12-06 23-54-21
おお、Contributorsの一覧が消えている!
つまり、研究室用アカウントがContributorsから消えたということです。

これでようやく元通りになりました。次からは気を付けよう…