初めに
基本は以下のリンク先の記事を参考にさせていただいています。
Git 別のリポジトリを履歴を残したまま取り込みたい
環境
- ubuntu18.04
- git version 2.17.1
今回やること
現状repo_a
とrepo_B
リポジトリが別々に存在し、以下のような構成になっています。
~/repo_A
|--- .git
~/repo_b
|--- .git
これをrepo_A
内にrepo_B
をディレクトリとして統合し、repo_Bの履歴も保持したまま以下のような構成にします。
~/repo_A
|--- .git
|---repo_B
Treeは下記のようになる想定です。
* <name> <commitID> marge repo_B in repo_A
|\
| * <name> <commitID> repo_B HEAD
| * <name> <commitID> commit3
| * <name> <commitID> commit2
| * <name> <commitID> commit1
| * <name> <commitID> repo_B init
* <name> <commitID> repo_A HEAD
* <name> <commitID> repo_A commit1
手順
Homeディレクトリにrepo_A
、repo_B
リポジトリをcloneする
$ cd ~ #hemeディレクトリで作業します
$ git clone <repo_Aのurl>
$ git clone <repo_Bのurl>
repo_B
を入れるディレクトリを作成
今回はrepo_A
の中に統合するためrepo_A
の中にあらかじめrepo_B
を入れるディレクトリを作成しておきます。
今回はそのままではありますが、ディレクトリ名をrepo_B
にします。
$ cd repo_A/
$ mkdir repo_B
#repo_BディレクトリをGit管理できるよう.gitkeepを作成します
$ touch repo_B/.gitkeep
$ git add -A repo_B
$ git commit -m "create repo_B dir" #ディレクトリをgitに追加します
repo_B
リポジトリをリモートリポジトリとして追加する
取り込みたいrepo_B
リポジトリをrepo_A
のリモートリポジトリに追加します。
ただし自分はfetch
が必要でしたので、以下の記事を参考にさせていただきました。
Git で複数のリポジトリをまとめたり、逆に切り出したりする
$ git remote add repo_B ~/repo_B
$ git fetch repo_B
subtreeとしてマージ
普通にマージしようとしますと以下のエラーが出ました。
$ git merge -X subtree=repo_B repo_B/master
fatal: refusing to merge unrelated histories
エラーメッセージから検索し、以下の記事を参考にさせていただきました。
初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ
git merge --allow-unrelated-histories -X subtree=repo_B repo_B/master
--allow-unrelated-histories
を付けないと関係のないツリーはマージできない仕様らしいです。
あとは要らなくなった.gitkeep
と~/repo_B
を消して完了です。
$ cd ~/repo_A/repo_B
$ rm .gitkeep
$ cd ~
$ rm -r repo_B #-rはディレクトリも削除するオプションです
参考にさせていただきました!
ありがとうございます!