Git Submodul Tracking spätestens

136

Wir verlagern unser (großes) Projekt auf Git und denken über die Verwendung von Submodulen nach. Unser Plan ist es, drei verschiedene Köpfe im Superprojekt zu haben: Release, Stable, Neueste. Die Projektleiter kümmern sich um die Freigabe und die stabilen Zweige. Sie verschieben die Submodule nach Bedarf.

Das Problem ist der "neueste" Kopf. Wir möchten, dass der "neueste" Kopf des Superprojekts die Hauptzweige aller Submodule (automatisch) verfolgt. Und es wäre auch großartig, wenn es die Geschichte aller Commits für das Submodul zeigen würde.

Ich habe mir Gitslave angesehen, aber es ist nicht ganz das, was wir wollen. Irgendwelche Vorschläge?

l.thee.a
quelle
Während Sie nach einem Tool gefragt haben, möchte ich nur diese Frage verbinden, die Einzeiler sammelt, die dasselbe tun: stackoverflow.com/questions/1030169/…
Tobu
Git bietet jetzt die Verfolgung der neuesten Version mit Submodulen an: siehe meine bearbeitete Antwort.
VonC

Antworten:

235

Update März 2013

Git 1.8.2 hat die Möglichkeit hinzugefügt, Zweige zu verfolgen.

" git submodule" lernte einen neuen Modus für die Integration mit der Spitze des Remote-Zweigs (im Gegensatz zur Integration mit dem im Gitlink des Superprojekts aufgezeichneten Commit).

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

Wenn Sie bereits ein Submodul vorhanden hatten , möchten Sie jetzt einen Zweig verfolgen. Weitere Informationen finden Sie unter " So erstellen Sie ein vorhandenes Submodul für einen Zweig ".

Allgemeine Informationen zu Submodulen finden Sie auch in Vogellas Tutorial zu Submodulen.

Hinweis:

git submodule add -b . [URL to Git repo];
                    ^^^

Siehe git submoduleManpage :

Ein spezieller Wert von .gibt an, dass der Name des Zweigs im Submodul mit dem Namen des aktuellen Zweigs im aktuellen Repository identisch sein soll .


Siehe Festschreiben b928922727d6691a3bdc28160f93f25712c565f6 :

submodule add: Wenn --branchangegeben, notieren Sie es in.gitmodules

Auf diese Weise können Sie eine submodule.<name>.branchOption einfach aufzeichnen, .gitmoduleswenn Sie ein neues Submodul hinzufügen. Mit diesem Patch

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

reduziert zu

$ git submodule add -b <branch> <repository> [<path>]

Dies bedeutet, dass zukünftige Anrufe an

$ git submodule update --remote ...

Sie erhalten Updates von demselben Zweig, mit dem Sie das Submodul initialisiert haben. Dies ist normalerweise das, was Sie möchten.

Unterzeichnet von: W. Trevor King


Ursprüngliche Antwort (Februar 2012):

Ein Submodul ist ein einzelnes Commit, auf das ein übergeordnetes Repo verweist.
Da es sich um ein Git-Repo für sich handelt, ist die "Historie aller Commits" über ein git loginnerhalb dieses Submoduls verfügbar.

Damit ein Elternteil automatisch das letzte Commit eines bestimmten Zweigs eines Submoduls verfolgen kann, muss es:

  • CD im Submodul
  • git fetch / pull, um sicherzustellen, dass die neuesten Commits im rechten Zweig vorhanden sind
  • CD zurück im Eltern-Repo
  • Hinzufügen und Festschreiben, um das neue Festschreiben des Submoduls aufzuzeichnen.

gitslave (den Sie bereits angesehen haben) scheint am besten zu passen, auch für die Festschreibungsoperation .

Es ist etwas ärgerlich, Änderungen am Submodul vorzunehmen, da der richtige Submodul-Zweig ausgecheckt, die Änderung vorgenommen, festgeschrieben und dann in das Superprojekt übergegangen werden muss, um das Commit festzuschreiben (oder zumindest den neuen Speicherort des Submoduls festzuschreiben) Submodul).

Weitere Alternativen finden Sie hier .

VonC
quelle
1
@BraveNewMath Sie müssen den richtigen Zweig in Ihrem Submodul auschecken, dann zu Ihrem übergeordneten Repo gehen und Folgendes eingeben : git config -f .gitmodules submodule.<path>.branch <branch>. Alles hinzufügen, festschreiben und pushen.
VonC
2
@BraveNewMath In stackoverflow.com/a/18799234/6309 werden alle Schritte zum Verfolgen eines Zweigs durch ein Submodul detailliert beschrieben .
VonC
1
Es ist wichtig, das --remoteTag zu verwenden, wenn Sie beim Aktualisieren keine abgetrennten Köpfe erhalten möchten, und sich zu fragen, warum Ihr frisch gezogener Code anscheinend hinter dem Master steckt!
Chris Watts
3
@DC_ Ich stimme "dieser Antwort" zu (seit ich sie geschrieben habe). Die Funktion "Nach einer Verzweigung" soll ein Submodul auf das neueste Commit einer Verzweigung aktualisieren. Sobald dies erledigt ist, müssen Sie noch den neuen Submodulstatus im übergeordneten Repo hinzufügen und festschreiben. Und der nächste Klon überprüft diesen Zustand (kopflos).
VonC
3
@VonC Zur weiteren Verdeutlichung wirkt sich die Funktion "Folgen einer Verzweigung" nur auf das Verhalten des git submodule updateBefehls aus, indem angegeben wird, auf welches Commit (dh das letzte Commit auf dem Master) das Submodul aktualisiert werden soll, und nicht automatisch, dass das übergeordnete Repo welches aktualisiert Auf Commit wird vom Submodul zur Klonzeit hingewiesen?
Christner