GitHub

[GitHub] リポジトリの所有者を変更するのに失敗した話

現在所属している会社では、元々2人で開発していたのもあって
個人アカウントのprivateリポジトリにCollaboratorを追加して運用していました。

少し人も増えて管理が面倒になって来たのでOrganizationアカウントに移行したいということになり、
やってみたら、リポジトリを消してしまう という大変な過ちを犯してしまった話です...

個人アカウントからOrganizationアカウントに移行する方法を考える

  1. アカウントをそのままOrganizationに変える
    • 個人アカウントとはいっても、会社用のアカウントではあったので、これもアリだった
    • https://github.com/settings/organizations
      • Turn xxx into an organization をすると出来る
    • ただし、ssh keyが消えるよ的なwarningが出る
      • ↑これが原因でGitHub連携してるサービスが軒並みエラーになると面倒だな、、、(未検証)
  2. Organizationを新規に作成してリポジトリを移す
    • 新しく作成して、移すのであれば、GitHub連携しているサービスは、個別に紐付けなおしていけばいいから安全そう
    • しかし、このリポジトリを移す方法を間違えて後に悲劇を生む

Organizationを作成する

  • Organizationを新規作成
  • 元のリポジトリの所有アカウントをメンバーに追加

リポジトリを移行する

結論を言うと
Settings>Options>Transfer ownership
で、リポジトリの所有権をそのままorganizationに移すべきでした。

しかし、この機能の存在を知らなかった為に
Organizationにforkする という方法を取ってしまいました。(※やってはいけなかった)
この方法だと、PRの履歴が消えてしまうけど、まぁしょうがないか、と。

元のリポジトリを削除したら...

さぁ、これで古いリポジトリは不要になったので、消そう!ということで
意気揚々と Delete this repository という Danger Zone ってしっかり書いてある事をやったわけです。

数日後...

Aさん: あれ?なんかXXXのリポジトリが404なんですけど、権限の問題ですかね...

え?いや、そんなはずは...
確認してみると、確かに無い。権限で見れないわけではなく、 存在しない

え、もしかして、privateリポジトリって、fork元消すと、fork先も消えるの????

ForkとTransferOwnershipを検証してみる

ここで始めて Transfer ownership という文字が目に入り。
え、所有権を移すこと出来るの...ってことに気づきました。

なので、試してみました。

事前準備

  • テスト用に fork-test という名前の空リポジトリを作成(また、消してしまうとまずいので)
  • XXXというアカウントからYYYというOrganizationにfork-testをforkしておく

fork元を削除してみる

  • 削除する時にwarningが出る
    • This action cannot be undone. This will permanently delete the XXX/fork-test repository, wiki, issues, and comments, and remove all collaborator associations. This will not change your billing plan. If you want to downgrade, you can do so in your Billing Settings. Please type in the name of the repository to confirm.
    • (´・ω・`)
  • fork先も消えた

なるほど...

forkした状態でtransfer ownershipしてみる

  • もう一度、fork-testを作成してforkしておく
  • transfer ownership実行
    • 同名のリポジトリ(?)があるのでforkできない
    • エラーメッセージ: YYY/fork-test already exists

forkしたリポジトリをrenameしてからtransfer ownershipしてみる

  • YYY/fork-test -> YYY/fork-test-renamed に変更
  • transfer ownership実行
    • transfer出来ない
    • エラーメッセージ: YYY already has a repository in the XXX/fork-test network

fork先を消してからtransfer ownershipしてみる

  • fork先を削除
    • forkしてない状態にする
    • 当然といえば当然だけど、fork先を削除してもfork元は消えなかったです
  • transfer ownership実行
    • 出来た
    • PRも残っている

publicなリポジトリで同じ事をやってみた

publicリポジトリはfork元を削除してもfork先は消えなかった

まとめ

  • リポジトリを移したい時はTransfer ownershipしましょう
    • forkの本来の使い方を考えれば当然といえば当然ですね...
  • privateなリポジトリをforkされている場合、fork元を消すとfork先も消える
    • fork元の権限でfork先を個別に削除するということはおそらくできないので
    • fork元を削除した時にfork先が残ってしまうのはたしかに困るのかもしれない
  • ちなみに、消してしまったリポジトリは、メンバーのローカルにあるのをかき集めてなんとか復旧させました
    • いろんな連携してたサービスのwebhookとかが消えて関連づけ直す必要があり、かなり大変でした
    • PR履歴は消えてしまったけど、幸いにも消えたリポジトリはサービスとは関係ないリポジトリだったので、諦めるという判断で合意した