Wenn Sie die exakte Commit-Historie des zweiten Repositorys beibehalten wollen und somit auch die Möglichkeit haben wollen, Upstream-Änderungen in Zukunft einfach zusammenzuführen, dann ist dies die richtige Methode für Sie. Sie führt dazu, dass die unveränderte Historie des Unterbaums in Ihr Projektarchiv importiert wird und ein Merge-Commit durchgeführt wird, um das zusammengeführte Projektarchiv in das Unterverzeichnis zu verschieben.
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."
Sie können Upstream-Änderungen wie folgt verfolgen:
git pull -s subtree XXX_remote master
Git findet vor dem Zusammenführen selbst heraus, wo die Wurzeln liegen, so dass Sie das Präfix bei späteren Zusammenführungen nicht mehr angeben müssen.
El Nachteil ist, dass die Dateien in der zusammengeführten Historie ohne Präfixe sind (nicht in einem Unterverzeichnis). Infolgedessen git log ZZZ/a
zeigt Ihnen alle Änderungen (falls vorhanden) mit Ausnahme derjenigen in der zusammengeführten Historie. Das können Sie tun:
git log --follow -- a
aber dadurch werden die Änderungen nur in der zusammengeführten Historie angezeigt.
Mit anderen Worten: Wenn Sie nicht ändern ZZZ
Dateien im Repository XXX
dann müssen Sie Folgendes angeben --follow
und einem nicht vorangestellten Pfad. Wenn Sie diese in beiden Repositories ändern, haben Sie 2 Befehle, von denen keiner alle Änderungen anzeigt.
Git-Versionen vor 2.9 : Sie müssen nicht die --allow-unrelated-histories
Option zu git merge
.
Die Methode in der anderen Antwort, die die read-tree
und überspringt die merge -s ours
Schritt ist im Grunde nichts anderes als das Kopieren der Dateien mit cp und das Übertragen des Ergebnisses.
Die Originalquelle stammt von github's "Teilbaum-Zusammenführung" Hilfe-Artikel . Und ein weiterer nützlicher Link .