📙

【GitHub】リポジトリの移譲、そのまま別組織のリポジトリにする方法

2024/12/25に公開

はじめに

初めての方も、そうでない方もこんにちは!
現役ゲームプログラマーのたむぼーです。
自己紹介を載せているので、気になる方は見ていただければ嬉しいです!

今回は
 リポジトリの移譲、そのまま別組織のリポジトリにする方法
について紹介します

https://zenn.dev/tmb/articles/1072f8ea010299

経緯

とある案件で、
A社のOrganizationのリポジトリを、B社のOrganizationのリポジトリに移譲する必要があり、
そのとき、すべてのコミット履歴やブランチの状態が保持したまま、
B社の新しいリポジトリとしてそのまま利用したかったためです。

一連の流れ

// 対象のリポジトリをbareオプションでクローン
git clone --bare git@github.com:organization-a/target-repository.git

// 対象のリポジトリに移動
cd target-repository.git

// 移譲したいリポジトリにmirrorオプションでプッシュ
// target-repositoryリポジトリのすべてのコミット履歴やブランチの状態が保持したまま、
// transfer-target-repositoryリポジトリにプッシュします。
git push --mirror git@github.com:organization-b/transfer-target-repository.git

解説

■A社のOrganizationの対象リポジトリをbareオプションでクローン

git clone --bare git@github.com:organization-a/target-repository.git

・--bare オプションを使用すると、リポジトリの履歴やメタデータのみがクローンされます
・クローン後、ローカルにはフォルダ【target-repository.git】が作成されます

■クローンしたフォルダに移動

cd target-repository.git

・bareオプションでクローンした場合、フォルダ名に【.git】が付くので注意が必要です!

■B社のOrganizationの対象リポジトリにmirrorオプションでプッシュ

git push --mirror git@github.com:organization-b/transfer-target-repository.git

・--mirrorオプションは、ブランチやタグを含めた複製を新しいリポジトリにプッシュされます

・もし、新しいリポジトリにREADMEファイルを追加してしまった場合

もし、プッシュできなかった場合、--forceオプションで強制的にプッシュもできます

git push --mirror --force git@github.com:organization-b/transfer-target-repository.git

リポジトリのサイズが大きい場合

branch毎プッシュを検討する

// 対象のリポジトリをbareオプションでクローン
git clone --bare git@github.com:organization-a/target-repository.git

// 対象のリポジトリに移動
cd target-repository.git

// ここまでは同じ

// 長くなるので一旦リモートを【new-origin】に置き換える
git remote add new-origin git@github.com:organization-b/transfer-target-repository.git

// ブランチやタグを表示
git show-ref
// こんな感じの表示がでます!
// f61a4a3c1a8ad7a46eeebab5798b909d6e3f6844 refs/heads/develop
// 240d09ec04cd4bd9dd953b2be5d3c8b8c040f9b5 refs/heads/feature

// 【new-origin】に対して、プッシュ
git push new-origin refs/heads/develop
// やってることは、これと同じ
// git push git@github.com:organization-b/transfer-target-repository.git refs/heads/develop

コミット毎プッシュを検討する

もし、ブランチ毎でもだめなら、最終手段

// 対象のリポジトリをbareオプションでクローン
git clone --bare git@github.com:organization-a/target-repository.git

// 対象のリポジトリに移動
cd target-repository.git

// ここまでは同じ

// 長くなるので一旦リモートを【new-origin】に置き換える
// ※ブランチ毎プッシュでやってたら不要
git remote add new-origin git@github.com:organization-b/transfer-target-repository.git

// refs/heads/developブランチのコミットを表示する例
// 300件毎のコミットを表示
// 【awk 'NR % 300 == 0】の300が件数、お好きに変えてください
git log --pretty=format:"%h %ad %s" --date=iso --reverse refs/heads/develop-android | awk 'NR % 300 == 0; END {print}'
// このような表示になる
// 71519eb 2024-10-04 16:37:36 +0900 コミット1
// b165dd9 2024-11-02 14:59:15 +0900 コミット2
// f61a4a3 2024-12-03 17:21:29 +0900 コミット3(最終コミット)

// 範囲でプッシュ
// ※古い順にプッシュが必要です
git push new-origin +71519eb:refs/heads/develop
git push new-origin +b165dd9:refs/heads/develop
git push new-origin +f61a4a3:refs/heads/develop

Discussion