We gebruiken git submodules om een paar grote projecten te beheren die afhankelijk zijn van vele andere bibliotheken die we ontwikkeld hebben. Elke bibliotheek is een aparte repo die in het afhankelijke project wordt gebracht als een submodule. Tijdens ontwikkeling willen we vaak gewoon de laatste versie van elke afhankelijke submodule pakken.
Heeft git een ingebouwd commando om dit te doen? Zo niet, wat dacht je van een Windows batch bestand of iets dergelijks dat dit kan doen?
Als het de eerste keer is dat je een repo checkout, moet je eerst `--init
gebruiken:
git submodule update --init --recursive
Voor git 1.8.2 of hoger is de optie --remote
toegevoegd om het bijwerken naar de laatste tips van remote branches te ondersteunen:
git submodule update --recursive --remote
Dit heeft het extra voordeel van het respecteren van "non default" branches gespecificeerd in de .gitmodules
of .git/config
bestanden (als je die toevallig hebt, standaard is origin/master, in welk geval sommige van de andere antwoorden hier ook zouden werken).
Voor git 1.7.3 of hoger kun je gebruiken (maar de onderstaande gotchas rond wat update doet zijn nog steeds van toepassing):
git submodule update --recursive
of:
git pull --recurse-submodules
als je je submodules naar de laatste commits wilt halen in plaats van waar de repo naar verwijst.
Zie git-submodule(1) voor details
Opmerking: Dit is van 2009 en kan toen goed zijn geweest, maar er zijn nu betere opties.
Wij gebruiken dit. Het heet 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
Zet het in een geschikte bin directory (/usr/local/bin). Als je op Windows werkt, moet je misschien de syntax aanpassen om het te laten werken :)
Update:
In antwoord op de opmerking van de oorspronkelijke auteur over het ophalen van alle HEADs van alle submodules -- dat is een goede vraag.
Ik ben er vrij zeker van dat git
hier intern geen commando voor heeft. Om dit te doen, zou je moeten identificeren wat HEAD werkelijk is voor een submodule. Dat kan zo simpel zijn als zeggen dat master
de meest actuele branch is, etc...
Maak hierna een eenvoudig script dat het volgende doet:
git submodule status
voor "modified" repositories. Het eerste karakter van de uitvoerregels geeft dit aan. Als een sub-repo gewijzigd is, wil je misschien NIET verder gaan.git checkout master && git pull
uit. Controleer op fouten.Ik'wil graag vermelden dat deze stijl niet echt is waar git submodules voor ontworpen zijn. Normaal gesproken wil je zeggen "LibraryX" is op versie "2.32" en zal dat zo blijven totdat ik zeg dat het moet "upgraden".
Dat is, in zekere zin, wat je doet met het beschreven script, maar dan meer automatisch. Voorzichtigheid is geboden!
Update 2:
Als je op een windows platform zit, zou je kunnen kijken of je Python kunt gebruiken om het script te implementeren, omdat het zeer capabel is op deze gebieden. Als u op unix/linux werkt, dan stel ik gewoon een bash script voor.
Heb je verduidelijkingen nodig? Plaats gewoon een reactie.
Ik denk dat je een script moet schrijven om dit te doen. Om eerlijk te zijn, zou ik misschien python installeren om het te doen, zodat je os.walk
kunt gebruiken om cd
naar elke directory te gaan en de juiste commando's te geven. Het gebruik van python of een andere scripttaal, anders dan batch, zou je in staat stellen om gemakkelijk subprojecten toe te voegen/te verwijderen zonder het script te hoeven wijzigen.