2011-01-15 9 views
7

Ich bin neu bei Git Submodulen, und ich bemerke, dass sie immer auf bestimmte Commits beziehen.Git Submodule auf Master

Gibt es eine Möglichkeit für Submodule eines Superprojekts, immer auf den Kopf des Master-Zweiges zu verweisen, so "git submodule update" oder "git pull" im Superprojekt einfach "git pull" auf allen Submodulen.

Danke.

+0

http://gitref.org/ Die Git Reference-Seite ist ein guter Einstieg, wenn Git neu ist. –

+1

@Saher: Dies ist eine sehr spezifische Frage, nicht nur eine allgemeine "Ich bin neu zu git". – Cascabel

+0

Ich denke, die Antwort ist nein. Git speichert den Commit-Namen, wenn er die Informationen des Submoduls aufzeichnet, und in meinem Fall habe ich eine Reihe von Scripts zum Ziehen, Hinzufügen, Commit und Push geschrieben, die genau das tun, was ich mit den Submodulen machen möchte. – sinelaw

Antwort

11

Die kurze Antwort ist nein. Die Idee ist, dass Sie sicher wissen, dass ein bestimmtes Commit des Submoduls mit Ihrem Projekt funktioniert und dass Sie kein undefiniertes oder unerwartetes Verhalten durch sofortige Updates erhalten möchten. Ein Submodul wird direkt durch zwei Dinge repräsentiert: einen Eintrag in .gitmodules und einen Gitlink, der eine Referenz auf den SHA1 des gewünschten Commits des Submoduls ist. SHA1, nicht Refname.

Was Sie fragen, ist wirklich für das Superprojekt zu haben keine Idee was ist in dem Submodul. Denken Sie darüber nach: Verschiedene Klone Ihres Projekts könnten das Submodul zu unterschiedlichen Zeiten aktualisiert haben und dann mit verschiedenen Versionen davon enden. Wenn dann in Ihrem Projekt Commits gemacht wurden, müssten sie verschiedene Commits im Submodul aufzeichnen. Wenn Sie zusammengeführt haben, müssen Sie wahrscheinlich ignorieren, was beide sagen und wahrscheinlich wieder ziehen. Das Ergebnis ist, dass Ihre Anfrage die gesamte Idee der Submodule vermeidet: zu wissen, was Sie haben. Wenn Sie sagen, dass Sie "Master" verwenden, würden Sie in zwei Monaten zurückkommen und keine Ahnung haben, was das bedeutet!

Wenn Sie immer den aktuellen Masterzweig erhalten möchten, sollten Sie es lieber selbst machen. Schreiben Sie ein Skript, um alle Submodule einzubinden, und führen Sie es ab und zu, und übergeben Sie die aktualisierten Versionen. (Testen Sie zuerst!) Der Punkt hier ist, dass Sie bei Submodulen für jedes Superprojekt-Commit genau wissen müssen, welche Version des Subprojekts Sie verwenden. Sie haben die Wahl, wie oft Sie die Version des Submoduls aktualisieren möchten. Es kann täglich sein, wenn Sie möchten.

Die Alternative wäre, das Verzeichnis (die Verzeichnisse) für das Submodul (die Submodule) zu Ihrem Gitignore hinzuzufügen und ein kleines Skript zu schreiben, um sie zu aktualisieren (und wahrscheinlich auch eines, um sie zu klonen). Dies würde Sie die Fähigkeit kosten zu wissen, welche Version Sie zu einem bestimmten Zeitpunkt in der Vergangenheit hatten.

+0

Aptly, wie immer. +1 – VonC

+0

Danke sehr klar - Zeit, um die Skriptfähigkeiten zu bekommen .. – Sam

+1

@Jefromi: Vielleicht könnten Sie Ihre Antwort aktualisieren, da es in Git jetzt möglich ist? Siehe VonCs Antwort. – Onur

10

-Update 2013, seit git 1.8.2, ein Submodul einem Zweig folgen kann (und nicht nur ein festen Bezug begeht)

Siehe "git submodule tracking latest".


(Original Antwort Januar 2011)

, dass eine der differences between git submodules and (for instance) svn:externals ist.

Ein Submodul sollte eine Gruppe von Dateien mit einem anderen Lebenszyklus sein, aus der Sie ein bestimmtes Commit auswählen, um an Ihrem eigenen Projekt (dem übergeordneten Repo) zu arbeiten.
Wenn dieses Submodul neues Commit veröffentlicht, sollten Sie nicht alles unterbrechen müssen, da Ihr Projekt aufgrund der neuesten Entwicklungen des Submoduls plötzlich nicht mehr kompiliert wird.

Wenn andererseits die beiden Dateien so eng verwandt sind, dass das Ändern von einem in einem die Aktualisierung des anderen bedeutet, dann sollten sie wirklich Teil von * one repo sein.