GitHubのアカウントを統合する
5分目次
GitHubのアカウントを2つ持っていて、会社用とプライベート用で使いわけていたのだが、いちいちcommits前に切り替えるのが億劫になってきた。ジョイン段階でも「別にプライベートのアカウントでも大丈夫ですよ」と伝えてもらっていたので仕事用のアカウントにプライベート用のアカウントを統合していくことにする。
TLDR;
- 各リポジトリの権限を移行していく
- 各リポジトリのcommitのcommiterを変更していく
- 移行元アカウントを削除する(必須でない)
僕が調べた時点では複数のリポジトリを一気に譲渡する方法などは見当たらなかったので基本的には手動でリポジトリを一つ一つ移行していく。1つのリポジトリの権限譲渡に1分くらいかかるから移行したいリポジトリが100個ある場合、100分の作業となる。
2に関してはGitHub上に表示している草を移行するための作業なので、もし「草なんかどうでもええわ」という場合は不要な作業となる。
手順1「各リポジトリの権限を移行していく」
リポジトリのsettingsページ(github.com/<アカウント名>/<リポジトリ名>/settings)にアクセスする。
下の方にスクロールすると赤枠で囲まれたDanger Zoneに
Transfer ownership
Transfer this repository to another user or to an organization where you have the ability to create repositories.
という項目があるのでここでTransferボタンを押し、移行したいアカウントを指定する。
移行したいアカウントの登録メアド宛に『Repository transfer From <旧アカウント名>』というメールが届くので承認すれば作業完了。
手順2「各リポジトリのcommitのcommiterを変更していく」
手順1で権限を移行したリポジトリがローカルに存在する場合はリモートのURLを変更します。vimなどで.git/configを編集すればOKです。
よくわからない場合は$ rm -rf <ディレクトリ名>
でローカルのリポジトリを削除し、改めて$ git clone <リポジトリURL>
を実行するのがいいですね。
ケースに合わせて
メインブランチの全てのコミットを無条件で自分の新しいアカウントにしたい
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='新しいGitHubのユーザー名'; GIT_AUTHOR_EMAIL='新しいGitHubアカウントのメールアドレス'; GIT_COMMITTER_NAME='新しいGitHubのユーザー名'; GIT_COMMITTER_EMAIL='新しいGitHubアカウントのメールアドレス';" --tag-name-filter cat HEAD
自分だけがcommitしていて、ブランチを分けてないリポジトリではこちらで良さそうです
全てのブランチの全てのコミットを無条件で自分の新しいアカウントにしたい
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='新しいGitHubのユーザー名'; GIT_AUTHOR_EMAIL='新しいGitHubアカウントのメールアドレス'; GIT_COMMITTER_NAME='新しいGitHubのユーザー名'; GIT_COMMITTER_EMAIL='新しいGitHubアカウントのメールアドレス';" --tag-name-filter cat -- --all
自分だけがcommitしていて、ブランチ運用をしてる場合はこちらです
前の自分のアカウントによるコミットだけを新しい自分のアカウントによるコミットにしたい
$ git filter-branch -f --env-filter '
if test "$GIT_AUTHOR_EMAIL" = "古いGitHubアカウントのメールアドレス"
then
GIT_AUTHOR_EMAIL="新しいGitHubアカウントのメールアドレス"
GIT_AUTHOR_NAME="新しいGitHubのユーザー名"
GIT_COMMITTER_EMAIL="新しいGitHubアカウントのメールアドレス"
GIT_COMMITTER_NAME="新しいGitHubのユーザー名"
fi' --tag-name-filter cat HEAD
全てのコミットにはGitのアカウントのメールアドレスやユーザー名の情報が紐づいており、その情報を見て草が表示されます。なので、全てのコミットに紐づいているメアドやユーザー名を新しいGitHubアカウントに切り替えれば新しいアカウントで草の表示が可能です。
上のコードでは全てのコミットを見ていき、以前のアカウントのメールアドレスのコミットだったら新しいアカウントのメールアドレスとアカウント名に置換するという分岐をしてます。
上記はメインブランチのコミットだけを見てるので、全てのブランチでメアドとアカウント名の置換を適用したいときは最後のHEAD
を-- --all
にすればOKです。
ユースケースとしては自分の旧アカウントが管理してるリポジトリで、他の人もコミットしてくれている場合などに使えますね
過去のコミッターのメールアドレスがわからない場合
$ git log -1 --pretty=full
でGitのログを見れるのでどのメールアドレスかが確認できます。
ここまで出来たら$ git push origin master -f
なり$ git push origin main -f
なりで強制pushし、ローカルの変更をリモートに適用すれば終了です。
参考
Git Git 歴史上のCommiterとAuthorの名前とメールアドレスを変更する 複数のユーザアカウントをマージする