JavaScriptを有効にしてください

GitHubのリポジトリを履歴を残したまま他のリポジトリへ移行する方法

 ·  ☕ 2 分で読めます  ·  ✍️ _da1kong

リポジトリをまとめるために、リポジトリから他のリポジトリに履歴を残したまま移行しました。そのとき行った方法です。

やりたいことのイメージ

.
├── 移行したいリポジトリ (base_repo)
└── 移行先のリポジトリ (target_repo)
    └── /target <- ここに「移行したいリポジトリ」を移行する

※ ただしこの場合ディレクトリの階層が異なるため、移行したいリポジトリの履歴と移行先のリポジトリの履歴が合わなくなります。
そのため、全体の階層を含めた履歴ではなく、ファイルの履歴だけの変更だけ取っておきたい目的と割り切って使用した方が良いです。

使用したバージョン

  • git 2.38.1

手順

移行先のリポジトリ に 移行用のディレクトリ を作成する

移行したいリポジトリのルートディレクトリで移行用のディレクトリを作成します。(コミットに反映されるように.gitkeepを置いています。)

1
2
3
4
$ mkdir target
$ touch target/.gitkeep
$ git add .
$ git commit -m "リポジトリの移行先のディレクトリを作成"

移行先のローカルリポジトリ に 移行したいリモートリポジトリ を登録する

移行したいリモートリポジトリからコミット履歴をfetchするために、移行したいリモートリポジトリを登録します。

1
$ git remote add <登録したい任意の名前> <GitHubのURL(ssh, httpsなど)>

登録したリポジトリのコミット履歴を移行先のローカルリポジトリに反映する

先ほど登録したリポジトリを使ってコミット履歴をfetchし、移行先のリポジトリに反映します。

1
2
3
4
5
$ git fetch <登録した任意の名前>
...
From <GitHub URL>
 * [new branch]      main     -> <登録した任意の名前>/<ブランチ名>
...

fetchできたことを確認して移行したいディレクトリにmergeします。

1
2
// git merge --allow-unrelated-histories -X subtree=<移行したいディレクトリ名> <登録した任意の名前>/ブランチ名
$ git merge --allow-unrelated-histories -X subtree=target target_repo/main

今回は移行したいリポジトリが移行先のリポジトリ内のディレクトリに移動させるため、エラー無視して反映できるように--allow-unrelated-historiesが必要です。

参考

共有

Daichi (@_da1kong)
著者
_da1kong
Software Developer