2017-03-13 12 views
1

Welche Funktionen kann ich verwenden, um alle Submodule (lokales Repo) mit der Version in einem entfernten Zweig zu synchronisieren/init/update?git - Abzweig und Submodule auschecken

Die „Sync“ (nennen wir es, dass ich meine nicht git sync!) Muss auch funktionieren, wenn:

  • Ein Submodul nur
  • Dateien innerhalb eines auf dem entfernten Zweig hinzugefügt wurde Submodul wurde lokal hinzugefügt/entfernt/modifiziert. Verfolgt oder nicht verfolgt.
  • Submodule werden entfernt (optional)

Wesentlichen die lokalen Repo an genau der gleichen Version wie der Remote-Zweig immer sein, ich will. Ohne viel zu fummeln, wenn ich etwas in den Submodulen ändere. Also kein manuelles ssh'ing zum Server, um ein neues Submodul zu initiieren, nur damit das Deploy-Skript funktioniert ...

Kann dies erreicht werden, ohne das gesamte Repository zu klonen (oder zu transferieren)? Ich entschied mich für git, um eine sichere und schnelle Möglichkeit zu haben, meine Quellen bereitzustellen. Aber die einzige Option, die ich mir vorstellen kann, ist, eine komplette git clone --recursive zu machen und Submodule an ihren entsprechenden Tags als nächstes auszuprobieren. In diesem Fall würde rsync die Synchronisierung von Dateien wahrscheinlich besser erledigen.

+0

Jedes Submodul ist ebenfalls ein eigenes Repository. Wenn Sie also das Top-Level-Repository R mit drei Submodulen S0, S1, S2 haben, müssen Sie sich um * vier * Repositories kümmern. Aber Repositories sind billig - nicht so billig wie Zweigstellen, aber immer noch ziemlich billig - wenn Sie * Referenzklone * verwenden. Die Submodule sind immer noch ein Schmerz in der Patootie. :-) – torek

Antwort

2

Was ist mit git submodule update --init --recursive? Es aktualisiert das Submodul mit dem richtigen Commit, initialisiert es bei Bedarf und führt dies für alle Submodule durch, selbst wenn sie sich in anderen Submodulen befinden. Wenn die Änderungen nicht verworfen werden, versuchen Sie zuerst git submodule foreach --recursive git reset --hard.

+0

Ich habe ein Submodul @ v1 im deploy-Zweig ausgecheckt und das geschoben.git Submodul update --init --recursive funktioniert, aber wenn ich es nach dem Drücken auf den Submodul Repo erneut, nach Tag v1, wird diese Änderung auch durch das Submodul Update gezogen – NoMad

+0

Können Sie näher erläutern, was Sie wollen und was tatsächlich das passiert? Was verpflichtest du wo und was passiert mit dem Submodul? – oyvind

+0

Huh, mein Kommentar hat nicht gepostet ... Ich habe jetzt das Problem gelöst, welches 'HEAD' vom Submodul war @' v2' nach dem 'git submodule update --init --recursive', sollte es aber sein wurde @ 'v1', die Version in myrepo ausgecheckt. Siehe meine Antwort unten – NoMad

0

Zuerst müssen Sie die benötigten Module an der gewünschten Position und Version manuell hinzufügen und auschecken. Um Update alle Submodule, sondern behalten ihre jeweilige Version, die in den Repo ausgecheckt wird, um sie enthält, kann man

git submodule update --init --recursive --rebase --force 

Die --rebase verursacht git zu überprüfen, die genaue verpflichten, dass das Submodul ausgecheckt ist at im enthaltenden Repo.

Dies wird fehlschlagen, wenn der lokale Repo Änderungen an Submodul-Dateien vorgenommen hat, so dass wir zuerst alle Submodule zurücksetzen müssen. Für Skript Nutzung:

git submodule foreach 'git reset --hard && git checkout . && git clean -fdx' 
git submodule update --init --recursive --rebase --force 

Die Reset-Befehle wurden direkt aus git undo all uncommitted changes genommen - Lassen Sie mich wissen, wenn etwas anderes besser geeignet für diesen usecase ist.

Keine zusätzliche Konfiguration erforderlich, überprüfen Sie einfach das Submodul @ gewünschte Commit oder Tag und schieben Sie diese Änderung in den enthaltenen Repo.

Diese Befehle erfüllen meine ersten zwei Voraussetzungen: Solange git das Submodul verfolgt, werden alle Änderungen vollständig mit "Clients" synchronisiert, die die Befehle ausführen. Wenn ein Submodul entfernt wird, kann git clean auf dem Repository ausgeführt werden, das die Submodule enthält, um oroha- ned Submoduldateien zu löschen.