Если вы хотите сохранить точную историю коммитов второго репозитория и, следовательно, также сохранить возможность легко объединять восходящие изменения в будущем, то вот метод, который вам нужен. Это приводит к тому, что в ваше хранилище импортируется немодифицированная история поддерева плюс один коммит слияния для перемещения объединенного репозитория в подкаталог.
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 "Слияние поддеревьев" . И еще одна полезная ссылка .