2010-07-08 12 views
10

Ich benutze Git Unterbaum Befehl, um ein paar Bibliotheken in ein Projekt zu ziehen.Prozedur zum Klonen von Git-Repos, die Teilbaum verwenden

Wenn ich dann das Projekt auf die normale Weise klonen, ich am Ende mit all dem Code, den ich brauche, aber ich verliere die Teilbaum Beziehungen - im Klon gibt es keine Fernbedienung für jede der Bibliotheken, und es gibt keine - Drücken Sie für beide Zweige.

Wie kann diese Verbindung am besten wiederhergestellt werden?

Genügt es

git remote add <lib> <remote-url> 
git fetch <lib> 

zu tun, wenn ich die Bibliothek zum ersten Mal hinzugefügt wurde ich folgen würde, dass mit:

git subtree add -P <local/lib> --squash "<lib>/master" 

Dies nicht, wenn bereits dem lokalen Verzeichnis funktioniert existiert aber, was natürlich passiert, wenn Sie ein Projekt geklont haben, dem bereits die Bibliothek hinzugefügt wurde.

Gibt es noch etwas, das man in dieser Situation tun sollte, um sicherzustellen, dass nachfolgende git subtree merge und git subtree split commands zur erwarteten Sache zusammenführt?

+0

'git subtree' ist kein Standard-Git-Befehl ... –

+0

" Eine experimentelle Alternative zum Befehl git-submodule "- https://github.com/apenwarr/git-subtree/ –

Antwort

3

Der Weg, den ich in der Vergangenheit diese Beziehung wieder hergestellt habe, war, indem ich einen Teilbaum merge.

git pull -s subtree <lib> master 

Auch wenn es nichts zu verschmelzen gibt/ziehen sollte es einfach zurückkehren, ohne etwas zu tun. Fühlen Sie sich frei, --squash zu dem oben genannten Pull hinzuzufügen, so dass Sie keine Remote-Geschichte ziehen.

8

Ich hatte sehr ähnliches Problem

Hier ist, wie ich die Unterstruktur auf den ersten

erstellt
git remote add -f sub_project url_to_remote_repository/project.git 
git merge -s ours --no-commit sub_project/master 
git read-tree --prefix=sub/project/ -u sub_project/master 
git commit -m "Added subtree merged in sub/project" 

und Änderungen aus dem „Projekt“ Repo zu bekommen, ich tat

git pull -s subtree sub_project master 

Jetzt schob ich mein lokales Repository zu Github und von einem anderen Computer klonte ich mein Github-Repository An diesem Punkt bekam ich alle erwarteten fi le in sub/project ... das ist großartig. Aber nicht mehr Remote und Beziehung mit Sub/Projekt. Also habe ich die folgende

git remote add -f sub_project url_to_remote_repository/project.git 
git merge -s ours --no-commit --squash sub_project/master 
git pull -s subtree sub_project master 

Und das hat gut funktioniert. Jetzt bin ich in der Lage, die Unterstruktur aus diesen geklonten Repository wie vor

git pull -s subtree sub_project master 

Hinweis zu verwalten:

1) in unserem Projekt, bevor wir git Submodule wurden verwendet, die für unsere Nutzer wirklich nicht gut war. Aus diesem Grund haben wir auf das Subtree-System von git umgestellt.
2) Ich hatte einige seltsame Fehler, wenn diese Operationen auf Windows-Rechner (mit git Version 1.7.9.msysgit.0), und die gleichen Operationen waren erfolgreich auf Linux. So, jetzt, um den Teilbaum zu manipulieren, verwende ich oft Linux (und wenn ich einen Fehler habe, versuche ich das gleiche auf Linux).

Hoffe, das kann helfen.

+1

tue ich nicht Verstehen Sie, wie die Zuordnung des Unterverzeichnis-Präfixes in der Reihenfolge der Befehle wiederhergestellt wird, die Sie nach einem neuen Klon beschrieben haben. Sollte irgendwo in den Kommandos ein "Sub/Project" sein? –

+0

Als ich den obigen Befehl zum Zusammenführen versuchte, versuchte ich, alles in die oberste Ebene meines Projekts einzufügen. Dieser Befehl schien jedoch zu funktionieren: "git merge --squash -s rekursiv -Xsubtree = sub/project --no-commit tracking_branch" –

+0

Eigentlich funktionierte das sogar noch besser: "git merge --squash -s unser -Xsubtree = sub/Projekt --no-commit tracking_branch " –

0

Ich bin über diese Frage während der Migration eines Projekts von der Verwendung von Submodulen zu Unterbäumen gelandet und endete mit keiner (zumindest nicht direkt, trotzdem) - Ich verwende jetzt das Tool git-subrepo.

Es löst dieses Problem durch Hinzufügen einer .gitrepo-Datei im Stamm jeder Unterstruktur. Die .gitrepo-Datei enthält Verfolgungsinformationen, einschließlich der Remote-URL, und ist dann in nachfolgenden Clones enthalten. Dies vereinfacht die Dinge wirklich und die einzige Komplikation ist, dass git-subrepo separat auf jedem Entwicklungscomputer installiert werden muss (obwohl das Repository immer noch ohne es verwendbar ist).

Verwandte Themen