QA@IT

Gitで別のリポジトリをサブディレクトリに取り込んで完全に吸収してしまいたい

9353 PV

とあるプロジェクトで、別々で管理していたリポジトリを1つにまとめる必要が出来ました。

なにか良い方法は無いでしょうか?

回答

リポジトリ aaa と bbb があって、aaa の master ブランチのサブディレクトリ subdir に リポジトリ bbb の master を取り込むとします。

リポジトリ aaa のワーキングディレクトリで作業します。

$ cd /path/to/aaa

master をチェックアウトしておきます。

$ git checkout master

リポジトリ bbb の master ブランチをリポジトリ aaa の bbb ブランチとして取り込みます。

$ git fetch /path/to/bbb/.git refs/heads/master:refs/heads/bbb

filter-branch で bbb ブランチの中身をごっそり subdir に移動します。

$ git filter-branch -f --tree-filter '
  [ -d subdir ] || mkdir subdir;
  find . -mindepth 1 -maxdepth 1 ! -path ./subdir | xargs -i{} mv {} subdir
' bbb

bbb ブランチを master ブランチにmergeします。

$ git merge --no-ff bbb
編集 履歴 (1)
  • `xargs -i{} mv {} subdir` のあたりでMacだと動きませんでしたがLinuxならば動きました。ありがとうございました。 -
  • macであれば、xargs -J % mv % subdir
    でできました。
    -
  • ppworks さんの修正の提案を取り込みました。bbb に merge-commit がある場合 cherry-pick は失敗するので merge の方が良いです(結果できあがるコミットログも merge の方がわかりやすそうです)。 -
  • 移動先が./subdir ではなく 2階層下の ./subdir1/subdir2 である場合、「そのようなファイルやディレクトリはありません」等と言われて動かなかったのですが、アドバイスを頂けませんでしょうか。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。