Verschachtelte Git-Repositorys?

181

Kann ich Git-Repositorys verschachteln? Ich habe:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Ist es sinnvoll, git init/adddie /project_rootVerwaltung von allem vor Ort zu vereinfachen, oder muss ich my_projectund die von Drittanbietern separat verwalten?

Jeremy Raymond
quelle

Antworten:

158

Möglicherweise suchen Sie nach der Git-Funktion namens Submodule . Mit dieser Funktion können Sie abhängige Repositorys verwalten, die in Ihrem Hauptrepository verschachtelt sind.

Greg Hewgill
quelle
42
Als relativer Git-Anfänger fand ich dieses Blog / Tutorial leichter zu verstehen. Chrisjean.com/2009/04/20/… Es ist einfacher, sich nur auf Git zu konzentrieren, anstatt den Kontext eines Helfer-Shell-Skripts zu haben. Ich fand es leichter zu lesen.
John K
4
Der chrisjean.com-Blog scheint nicht aktuell zu sein, da er nur versucht hat, ihm zu folgen. Der Wiki-Beitrag von Greg mag etwas komplizierter sein, aber als Git-Neuling ziehe ich es vor, genau zu sein ...
Salbei
Das Blog scheint jetzt gut zu funktionieren, und leider für Salbei scheinen die 34 (jetzt 35) Up-Votes zu dem Kommentar zu stimmen, dass der Blog-Artikel einen Wert hat. Es stellt sich heraus, dass Sie die Genauigkeit nicht für Klarheit und betriebsspezifische Ratschläge opfern müssen. Nach dem Lesen würde ich mir vorstellen, dass der Autor bereits ein wenig recherchiert und wahrscheinlich die eigentliche Git-Dokumentation gelesen hat , nicht nur die Wiki-Seite von kernel.org. Die Git-orientierte Erklärung des Blog-Autors in einem vollständig kontextualisierten Beispiel scheint für eine große Anzahl von Personen sehr hilfreich zu sein ...
Matthew Weber
13
Übrigens ist der oben erwähnte Chrisjean-Link tot. Der aktualisierte Link ist chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh
35

Platzieren Sie Ihre Bibliotheken von Drittanbietern in einem separaten Repository und verknüpfen Sie sie mithilfe von Submodulen mit dem Hauptprojekt. Hier ist ein Rundgang:

http://git-scm.com/book/en/Git-Tools-Submodules

Bei der Entscheidung, wie ein Repo segmentiert werden soll, entscheide ich mich normalerweise dafür, wie oft ich sie ändern würde. Wenn es sich um eine Bibliothek eines Drittanbieters handelt und nur Änderungen, die Sie daran vornehmen, auf eine neuere Version aktualisiert werden, sollten Sie sie auf jeden Fall vom Hauptprojekt trennen.

Igor Zevaka
quelle
22

Nur der Vollständigkeit halber:

Es gibt eine andere Lösung, die ich empfehlen würde: das Zusammenführen von Teilbäumen .

Im Gegensatz zu Submodulen ist die Wartung einfacher. Sie würden jedes Repository auf normale Weise erstellen. In Ihrem Hauptrepository möchten Sie den Master (oder einen anderen Zweig) eines anderen Repositorys in einem Verzeichnis Ihres Hauptverzeichnisses zusammenführen.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Verwenden Sie dann die Strategie zum Zusammenführen von Teilbäumen, um das andere Repository in Ihr Verzeichnis zu ziehen (um es zu aktualisieren):

$ git pull -s subtree OtherRepository master

Ich benutze diese Methode seit Jahren, sie funktioniert :-)

Weitere Informationen zu dieser Methode, einschließlich des Vergleichs mit Submodulen , finden Sie in diesem Git- Howto-Dokument .

Phil
quelle
Der Teilbaum, der die Referenz mit dem Git-Buch zusammenführt, funktioniert nicht mehr. Derzeit scheint dies der Link zu sein: git-scm.com/book/en/v2/…
Ericx
18

Sie könnten hinzufügen

/project_root/third_party_git_repository_used_by_my_project

zu

/project_root/.gitignore

Dadurch sollte verhindert werden, dass das verschachtelte Repo in das übergeordnete Repo aufgenommen wird, und Sie können unabhängig damit arbeiten.

Aber: Wenn ein Benutzer git clean -dfx im übergeordneten Repo ausführt, wird das ignorierte verschachtelte Repo entfernt. Eine andere Möglichkeit besteht darin, den Ordner zu verknüpfen und den Symlink zu ignorieren. Wenn Sie dann git clean ausführen, wird der Symlink entfernt, aber das 'verschachtelte' Repo bleibt erhalten, da es sich wirklich an anderer Stelle befindet.

mikkelbreum
quelle
5

Zusammenfassung.

Kann ich Git-Repositories verschachteln?

Ja. Standardmäßig verfolgt git jedoch nicht den .gitOrdner des verschachtelten Repositorys. Git verfügt über Funktionen zum Verwalten verschachtelter Repositorys (lesen Sie weiter).

Ist es sinnvoll, init / add / project_root zu aktivieren, um die lokale Verwaltung zu vereinfachen, oder muss ich my_project und das von Drittanbietern separat verwalten?

Dies ist wahrscheinlich nicht sinnvoll, da Git über Funktionen zum Verwalten verschachtelter Repositorys verfügt. Gits integrierte Funktionen zum Verwalten verschachtelter Repositorys sind submoduleund subtree.

Hier ist ein Blog zum Thema und hier ist eine SO-Frage , die die Vor- und Nachteile der jeweiligen Verwendung abdeckt.

Lachy
quelle
2

Ich würde ein Repository pro Projekt verwenden. Auf diese Weise wird das Durchsuchen des Verlaufs einfacher.

Ich würde auch die Version der von mir verwendeten Drittanbieter-Bibliothek in das Repository des Projekts einchecken, das sie verwendet.

Gnud
quelle