Wenn Sie den genauen Festschreibungsverlauf des zweiten Repositorys beibehalten und daher auch in Zukunft problemlos Upstream-Änderungen zusammenführen möchten, finden Sie hier die gewünschte Methode. Dies führt dazu, dass der unveränderte Verlauf des Teilbaums in Ihr Repo importiert wird, plus ein Zusammenführungs-Commit, um das zusammengeführte Repository 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 folgendermaßen verfolgen:
git pull -s subtree XXX_remote master
Git findet selbst heraus, wo sich die Wurzeln befinden, bevor die Zusammenführung durchgeführt wird, sodass Sie das Präfix bei nachfolgenden Zusammenführungen nicht angeben müssen.
Der Nachteil ist, dass im zusammengeführten Verlauf die Dateien nicht fixiert sind (nicht in einem Unterverzeichnis). Als Ergebnis git log ZZZ/a
werden Ihnen alle Änderungen (falls vorhanden) mit Ausnahme derjenigen im zusammengeführten Verlauf angezeigt. Du kannst tun:
git log --follow -- a
Dadurch werden jedoch keine anderen Änderungen als in der zusammengeführten Historie angezeigt.
Mit anderen Worten, wenn Sie die ZZZ
Dateien im Repository nicht ändern , XXX
müssen Sie --follow
einen nicht festgelegten Pfad angeben . Wenn Sie sie in beiden Repositorys ändern, haben Sie zwei Befehle, von denen keiner alle Änderungen anzeigt.
Git-Versionen vor 2.9 : Sie müssen die --allow-unrelated-histories
Option nicht an übergeben git merge
.
Die Methode in der anderen Antwort, die read-tree
den merge -s ours
Schritt verwendet und überspringt, unterscheidet sich effektiv nicht vom Kopieren der Dateien mit cp und Festschreiben des Ergebnisses.
Die ursprüngliche Quelle war der Hilfeartikel "Subtree Merge" von github . Und noch ein nützlicher Link .