メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

GitHubユーザーアカウントを1つにまとめる方法

 

GitHubユーザーアカウントを2つ以上持っていて
それを統合したいって方へ向けてです。

どれを残すか

たとえばA,B 2つのリポジトリがあるとします。
(本稿内ではずっとA,Bや新旧などと表現します)

どちらを残すかですが、判断基準としてはプロフィールページ上の
・登録日(Joined on 2 Oct 2012)を優先するか
・Followersを優先するか
あたりになるかなと思います。
この2つの項目を見てどちらを残すか決めます。

判断基準に影響しないのは
・Gist (forkしておきましょう。忘れがちなので注意)
リポジトリ (通常の手順でどちらかに移せます)
・ユーザー名 (通常の手順でAにでもBにでも変更できます)
・Following (フォローしなおせばよい)
・Star (付け直せばよい)
プロフィール画像 (アップしなおせばよい)
となります。
Contributionsのグラフは後述です。

私のケースでは
A : リポジトリいっぱいあって、BよりはContributions盛ん
  ブログからgist-itで参照しているリポジトリがあるのでリンク切れしたら困る
B : Join date古い(残したい)、FollowersもAより多い
という状況だったので、
Aのリポジトリ達をBに移してまとめ、空になったAユーザーを削除して、
ユーザー名をBからAに変更して戻す作戦としました。

ということで、Aを旧、Bを新、と呼ぶことにします。
(でも最終的なユーザー名はAになります)

なお、Contributionsのグラフですが、
手順の最後でAに戻した際に復活しました^^
ユーザー名で引っ掛けているものと思われます。
(これは事前検証できずで諦めていたので 残ってラッキー!)

全体の流れ

ということで先ほど触れましたが
・Gistをforkして移す (A⇒Bへ引っ越し)
リポジトリを一箇所に寄せる (A⇒Bへ引っ越し)
・旧アカウント削除 (Aを削除; BをAにしたいため)
・新アカウントのユーザー名変更 (B⇒Aへ名変)
という感じでやります。
なお、最後のBをAということをやらない場合は旧ユーザーであるAも削除しなくても良さそうですね。

間違えるとリポジトリを落としてしまうことになるので、
実施する方はじっくり取り組んでくださいね!

なお、ブラウザの通常モードとシークレットモードを1つずつ左右に立ち上げて
そのうえで作業すればオペミスのリスクは少し下がるかも知れません。

Gistをfork

Gistはオーナーをtransferできないのでforkします。
URLが変わるのでブログからリンク張っている方などは変更が必要です。

リポジトリを引っ越す

まぁこれ普通の手順ですね。

リポジトリを開いてSettingsタブを開き、
(ここでRepository nameをコピペすると楽かも)
最下部のDanger Zoneの中に
Transfer ownershipがあるのでTransferボタンを押します。

Type the name of the repository to confirm にリポジトリ
New owner’s GitHub username or organization name に移譲先ユーザー名を入力します。
(この時点ではまだリポジトリの引っ越しは終わってません)

"Repository transfer to 新ユーザー名 requested"
とメッセージ表示され、移譲先のBアカウントのメールアドレスにメールが送られるので
URLをクリックして数分で完了します。
メッセージが
"Moving repository to 新ユーザー名/リポジトリ名. This may take a few minutes."
と出るので、おそらくすぐ完了しないこともあると思います。
引っ越しが完了したことをちゃんと確認しましょう。

これを旧アカウントのすべての(移行必要な)リポジトリに対して行います。

ちなみにリポジトリをTransferすると、元のユーザーはCollaboratorsに入ります。
今回のケースだと旧ユーザーは削除するのでCollaboratorsからも消えますが
少しアレンジする方などはここも気にした方が良いかも知れません。

旧アカウント削除

こちらも通常の手順でユーザー削除します。

右上メニューからSettingsを開き
Personal settingsの中からAccountをクリック。

最下部のDelete accountの中の
Delete your accountボタンを押します。

Your username or email にユーザー名またはメールアドレス
To verify, type delete my account below に確認の"delete my account"をそのまま入力
(Confirm your password も表示されている場合は、パスワードを入力し、)
Cancel plan and delete this accountボタンをクリックすると退会完了です。

"Account successfully deleted."
が表示されて、ログイン画面に戻ると思います。

新アカウントのユーザー名変更 (B⇒Aへ名変)

最後に、ユーザー名BをAに変更します。

右上メニューからSettingsを開き
Personal settingsの中からAccountをクリック。

中段のChange usernameの中の、Change usernameボタンを押します。

なお、ユーザー名変更についての詳細な影響は、リンクにある通り
https://help.github.com/articles/what-happens-when-i-change-my-username/
にまとめられています。

"Really change your username?"
と確認が出ます。

ここで言われている
・We will not set up redirects for your old profile page.
・We will not set up redirects for Pages sites.
・We will create redirects for your repositories (web and git access).
・Renaming may take a few minutes to complete.
については、
・ユーザー名のページはリダイレクトされません。
・Pages sitesについてもリダイレクトされません。
・ただし、リポジトリについてはリダイレクトします(Web, Gitのアクセス共に)。
・ユーザー名変更は数分かかることもあります。
とのことです。

I understand, let's change my username
ボタンをクリックすると、
Enter a new usernameダイアログが出ますので、
変更後のユーザー名を入力して、
Change my usernameボタンを押すとユーザー名変更が開始されます。

完了すると
"Your account has been renamed."
"Remember to update your local repositories to point to the new location."
と表示されます。

つまり、ローカルリポジトリはユーザー名変更後のリポジトリを参照しますのでよろしくね、ということですね。

完了

・Joined date
・Followers
共に残すアカウントになりました。

もちろんリポジトリは既に寄せておいたので、残したいものが残っています。
ユーザー名も最後に変更したので、元通り

FollowingとStarをしなおして統合完了です。

ContributionsのグラフもユーザーAのもので表示されるようになりました!

ただ、元Aのユーザーで他リポジトリに出していたIssuesの起票ユーザーは
"ghost"と表示されるようになりました。
これは途中の手順で旧Aを退会させたからでしょう。

ローカルリポジトリのremoteを差し替えて
https://help.github.com/articles/changing-a-remote-s-url/
SSHを再登録すればGitHub内での一連の変更は完了でしょう。

なお、gist-itのプラグインもうまい具合に参照できてました。
gist-itプラグインからAのリポジトリへ参照するblog記事があったのですが、
A⇒Bにリポジトリを移した途中の段階でもちゃんと見れていました。
これはChange usernameでリポジトリのurlはちゃんとリダイレクトするよ、
というところがこれに該当すると思います。

後日談

Qiitaログインに関して。

QiitaはAに紐付けていたが
結局残したアカウントはB(アカウント名は最終的にA)だったので
そのままQiitaにGitHubでログインしたら
不正なログインということでロックされてしまいました。
(登録アドレスに確認メールが送られてきてすぐ解除はできた)

旧アカウントに紐付いているアプリは付け替えが必要ですね。

後日談2

Gistの移行を忘れれてトバしてしまった…(汗
forkしておきましょう。
(本稿内には追記しておきました)