Якщо ви хочете зберегти точну історію фіксації другого сховища і, отже, також зберегти можливість легко зливати зміни вгору за потоком в майбутньому, то ось вам потрібний метод. Це призводить до того, що немодифікована історія імпорту піддерева у ваше репортаж плюс одна фіксація злиття для переміщення об'єднаного сховища у підкаталог.
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 команди, жодна з яких не відображає всіх змін.
Версії Git до 2.9 : --allow-unrelated-histories
опцію не потрібно передавати git merge
.
Метод в іншій відповіді, який використовує read-tree
та пропускає merge -s ours
крок, фактично не відрізняється від копіювання файлів на cp та фіксації результату.
Оригінальне джерело було із статті довідки github "Злиття підкреслень" . І ще одне корисне посилання .