JavaScriptを有効にしてください

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

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

作業用リポジトリが増えてきたので、1つにまとめました。その際に git 履歴を残したまま移行したので、その方法を解説します。

やりたいことのイメージ

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

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

使用したバージョン

  • git 2.38.1

手順

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

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

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

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

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

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

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

先ほど登録したリポジトリを使ってコミット履歴を 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 が必要です。

By default, git merge command refuses to merge histories that do not share a common ancestor. This option can be used to override this safety when merging histories of two projects that started their lives independently. As that is a very rare occasion, no configuration variable to enable this by default exists or will be added.
ref. –allow-unrelated-histories

共有

Daichi (@da1chi24)
著者
daichi
Software Developer