git で管理していると、一つのスクリプトだけリポジトリとかができてしまったりします。
そういうのを一旦を統合して、過去の履歴を残した状態にしたいことは結構あります。
というか、業務でありました。
調べて見たら情報はあるようでなかったので、まとめます。
想定するまとめ方
大きいリポジトリ a
に小さいリポジトリ b
を統合する。
テスト環境の構築
mkdir a
cd a/
git init
touch a.txt
git add -A
git commit -m "1"
mkdir -p script/test1/
touch script/test1/index.sh
git add -A
git commit -m "2"
mkdir -p script/test2/
touch script/test2/index.sh
git add -A
git commit -m "3"
cd ..
mkdir b
cd b/
git init
touch b.txt
git add -A
git commit -m "101"
touch index.sh
git add -A
git commit -m "102"
echo "hogehoge" > index.sh
git add -A
git commit -m "103"
cd ..
以上を適当な場所で実行すると以下のようになるはずです。
$ tree
.
├── a
│ ├── a.txt
│ └── script
│ ├── test1
│ │ └── index.sh
│ └── test2
│ └── index.sh
└── b
├── b.txt
└── index.sh
5 directories, 5 files
$ cd a/
$ git log --oneline --graph --decorate=full
* 57ede31 (HEAD -> refs/heads/master) 3
* 0581249 2
* b95c42d 1
$ cd ../b
$ git log --oneline --graph --decorate=full
* 0671e8d (HEAD -> refs/heads/master) 103
* 2f3dff9 102
* 492a0b7 101
ここから統合していきます。
実際の作業
cd a/
mkdir script/b
git remote add b ../b
git fetch b
mkdir script/b
touch script/b/.gitkeep
git add -A
git commit -m "hoge"
git merge -X subtree=script/b/ b/master --allow-unrelated-histories
git rm script/b/.gitkeep
git commit -m "hoge"
とりあえず mastar
にマージしていますが、実際はブランチ切って、プルリクエスト投げるのが正しいと思います。
どういう状態になるか
$ tree
.
├── a.txt
└── script
├── b
│ ├── b.txt
│ └── index.sh
├── test1
│ └── index.sh
└── test2
└── index.sh
4 directories, 5 files
$ git log --oneline --graph --decorate=full
* a928c18 (HEAD -> refs/heads/master) hoge
* ecf9fd8 Merge remote-tracking branch 'b/master'
|\
| * 0671e8d (refs/remotes/b/master) 103
| * 2f3dff9 102
| * 492a0b7 101
* 17e5dfc hoge
* 57ede31 3
* 0581249 2
* b95c42d 1
確認すると分かる通り、2つが統合された形になります。
参考文献
https://chaika.hatenablog.com/entry/2015/06/04/173401
https://qiita.com/takanatsu/items/fc89de9bd11148da1438