2 番目のリポジトリの正確なコミット履歴を保持し、将来的に上流の変更を簡単にマージする機能も保持したい場合は、次の方法が適しています。サブツリーの変更されていない履歴がリポジトリにインポートされ、マージされたリポジトリをサブディレクトリに移動するためのマージ コミットが 1 つ発生します。
git remote add XXX_remote <path-or-url-to-XXX-repo>
git fetch XXX_remote
git merge -s ours --no-commit --allow-unrelated-histories XXX_remote/master
git read-tree --prefix=ZZZ/ -u XXX_remote/master
git commit -m "Imported XXX as a subtree."
次のようにアップストリームの変更を追跡できます。
git pull -s subtree XXX_remote master
Git は、マージを実行する前にルートがどこにあるかを独自に把握するため、後続のマージでプレフィックスを指定する必要はありません。
欠点は、マージされた履歴では、ファイルの接頭辞が付けられていないことです (サブディレクトリではありません) 。その結果git log ZZZ/a
、マージされた履歴以外のすべての変更 (ある場合) が表示されます。できるよ:
git log --follow -- a
ただし、マージされた履歴以外の変更は表示されません。
ZZZ
つまり、リポジトリ内の のファイルを変更しない場合は、接頭辞なしのパスXXX
を指定する必要があります。--follow
両方のリポジトリでそれらを変更すると、2 つのコマンドがあり、いずれもすべての変更を表示しません。
2.9 より前の Git バージョン--allow-unrelated-histories
:オプションをに渡す必要はありませんgit merge
。
read-tree
ステップを使用してスキップする他の回答の方法は、merge -s ours
cpでファイルをコピーして結果をコミットすることと実質的に違いはありません。
元のソースは、github の「サブツリー マージ」ヘルプ記事からのものです。そして別の便利なリンク.