Naudojame "git" submodulius keliems dideliems projektams, kurie priklauso nuo daugelio kitų mūsų sukurtų bibliotekų, valdyti. Kiekviena biblioteka yra atskira repozitorija, į priklausomą projektą įtraukta kaip submodulis. Kurdami dažnai norime tiesiog paimti naujausią kiekvieno priklausomo submodulio versiją.
Ar git turi integruotą komandą, kuri leistų tai padaryti? Jei ne, kaip dėl "Windows" paketinio failo ar panašaus veiksmo, kuris galėtų tai padaryti?
Jei tai pirmas kartas, kai tikrinate atliekyną, pirmiausia turite naudoti ```--init````:
git submodule update --init --recursive
git 1.8.2 ar naujesnėms versijoms pridėta parinktis ---remote
, kad būtų galima atnaujinti nuotolinių šakų naujausius patarimus:
git submodule update --recursive --remote
Papildoma nauda yra ta, kad atsižvelgiama į visas "ne numatytąsias" šakas, nurodytas .gitmodules
arba .git/config
failuose (jei tokių turite, pagal nutylėjimą yra origin/master, tokiu atveju tiktų ir kai kurie kiti čia pateikti atsakymai).
Galite naudoti git 1.7.3 arba naujesnę versiją (tačiau toliau pateiktos problemos, susijusios su tuo, ką daro atnaujinimas, vis dar galioja):
git submodule update --recursive
arba:
git pull --recurse-submodules
jei norite, kad jūsų submoduliai būtų traukiami į naujausius pakeitimus, o ne į tai, į ką nurodo repas.
Išsamiau žr. git-submodule(1).
Pastaba: tai yra 2009 m. ir galbūt tada buvo geras, bet dabar yra geresnių variantų.
Mes naudojame šį. Ji vadinasi 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
Tiesiog įdėkite jį į tinkamą bin katalogą (/usr/local/bin). Jei naudojate "Windows", gali tekti pakeisti sintaksę, kad ji veiktų :)
Atnaujinta:
Atsakydamas į pradinio autoriaus komentarą apie visų submodulių HEAD'ų perkėlimą - tai geras klausimas.
Esu beveik tikras, kad git
neturi tam skirtos vidinės komandos. Norint tai padaryti, reikėtų nustatyti, kas iš tikrųjų yra submodulio HEAD. Tai galėtų būti labai paprasta, tarkime, kad master
yra naujausia šaka ir t. t.
Po to sukurkite paprastą scenarijų, kuris atliktų šiuos veiksmus:
git submodulų būseną
dėl "modifikuotų" saugyklų. Tai rodo pirmasis išvesties eilučių simbolis. Jei subrepozitoriumas yra modifikuotas, galite NEGALIMA tęsti.git checkout master &;& & git pull
. Patikrinkite, ar nėra klaidų.Norėčiau paminėti, kad toks stilius iš tikrųjų nėra tai, kam buvo sukurti git submoduliai. Paprastai norima pasakyti, kad "LibraryX" yra versijos "2.32" ir tokia išliks, kol pasakysiu "atnaujinti".
Tam tikra prasme tai ir yra tai, ką darote aprašytuoju scenarijumi, tik labiau automatiškai. Reikia būti atsargiems!
Atnaujinimas 2:
Jei naudojate "Windows" platformą, scenarijui įgyvendinti galite naudoti "Python", nes ši programa yra labai pajėgi šiose srityse. Jei naudojate unix/linux, siūlau tiesiog bash skriptą.
Reikia kokių nors paaiškinimų? Tiesiog parašykite komentarą.
Manau, kad turėsite parašyti scenarijų, kad tai padarytumėte. Tiesą sakant, galėčiau įdiegti python, kad galėtumėte naudoti os.walk
, kad cd
patektų į kiekvieną katalogą ir išduotų atitinkamas komandas. Naudodami python ar kitą scenarijų kalbą, išskyrus paketinę, galėsite lengvai pridėti / pašalinti paprojektžius, nekeisdami scenarijaus.