Wir verwenden Git-Submodule, um einige große Projekte zu verwalten, die von vielen anderen Bibliotheken, die wir entwickelt haben, abhängig sind. Jede Bibliothek ist ein separates Repo, das als Submodul in das abhängige Projekt eingebracht wird. Während der Entwicklung wollen wir oft einfach die neueste Version jedes abhängigen Submoduls holen.
Verfügt Git über einen eingebauten Befehl, um dies zu tun? Wenn nicht, wie wäre es dann mit einer Windows-Batch-Datei oder ähnlichem, die das erledigen kann?
Wenn es das erste Mal ist, dass Sie ein Repo auschecken, müssen Sie zuerst --init
benutzen:
git submodule update --init --recursive
Für git 1.8.2 oder höher wurde die Option --remote
hinzugefügt, um das Aktualisieren auf die neuesten Tips der entfernten Zweige zu unterstützen:
git submodule update --recursive --remote
Dies hat den zusätzlichen Vorteil, dass alle "Nicht-Standard"-Zweige respektiert werden, die in den Dateien .gitmodules
oder .git/config
angegeben sind (wenn Sie zufällig welche haben, ist die Voreinstellung origin/master, in diesem Fall würden einige der anderen Antworten hier ebenfalls funktionieren).
Für git 1.7.3 oder höher können Sie es verwenden (aber die unten aufgeführten Probleme, was Update macht, gelten immer noch):
git submodule update --recursive
oder:
git pull --recurse-submodules
wenn Sie Ihre Submodule auf die neuesten Commits ziehen wollen, anstatt auf das, worauf das Repo zeigt.
Siehe git-submodule(1) für Details
**Anmerkung: Dies ist von 2009 und mag damals gut gewesen sein, aber es gibt jetzt bessere Möglichkeiten.
Wir benutzen dies. Es heißt git-pup
:
#!/bin/bash
# Exists to fully update the git repo that you are sitting in...
git pull && git submodule init && git submodule update && git submodule status
Legen Sie es einfach in ein geeignetes bin-Verzeichnis (/usr/local/bin). Unter Windows müssen Sie möglicherweise die Syntax ändern, damit es funktioniert :)
Aktualisierung:
Als Antwort auf den Kommentar des ursprünglichen Autors, alle HEADs aller Submodule einzulesen - das ist eine gute Frage.
Ich bin mir ziemlich sicher, dass git
intern keinen Befehl dafür hat. Um dies zu tun, müsste man identifizieren, was HEAD für ein Submodul wirklich ist. Das könnte so einfach sein wie zu sagen, dass master
der aktuellste Zweig ist, usw...
Danach erstellen Sie ein einfaches Skript, das folgendes tut:
git submodule status
auf "modifizierte" Repositories. Das erste Zeichen in den Ausgabezeilen zeigt dies an. Wenn ein Sub-Repository geändert wurde, sollten Sie NICHT fortfahren.git checkout master && git pull
aus. Prüfen Sie auf Fehler.Ich möchte erwähnen, dass dieser Stil nicht wirklich das ist, wofür Git-Submodule konzipiert wurden. Normalerweise möchte man sagen, dass "LibraryX" die Version "2.32" hat und diese beibehalten wird, bis ich ihr sage, dass sie "upgraden" soll.
Das ist in gewissem Sinne das, was Sie mit dem beschriebenen Skript tun, nur eben automatischer. Vorsicht ist geboten!
Update 2:
Wenn Sie auf einer Windows-Plattform arbeiten, sollten Sie vielleicht Python für die Implementierung des Skripts verwenden, da es in diesen Bereichen sehr leistungsfähig ist. Wenn Sie unter Unix/Linux arbeiten, empfehle ich Ihnen ein Bash-Skript.
Benötigen Sie weitere Erklärungen? Schreiben Sie einfach einen Kommentar.
Ich denke, Sie müssen ein Skript schreiben, um dies zu tun. Um ehrlich zu sein, würde ich dafür Python installieren, damit Sie mit os.walk
in jedes Verzeichnis gehen und die entsprechenden Befehle eingeben können. Die Verwendung von Python oder einer anderen Skriptsprache als Batch würde es Ihnen ermöglichen, Unterprojekte einfach hinzuzufügen oder zu entfernen, ohne das Skript ändern zu müssen.