Używamy podmodułów git do zarządzania kilkoma dużymi projektami, które są zależne od wielu innych bibliotek, które opracowaliśmy. Każda biblioteka stanowi osobne repozytorium wprowadzone do projektu zależnego jako podmoduł. Podczas opracowywania często chcemy po prostu pobrać najnowszą wersję każdego zależnego podmodułu.
Czy git ma wbudowane polecenie, aby to zrobić? Jeśli nie, to co powiesz na plik wsadowy Windows lub podobny, który może to zrobić?
git
git-submodules
Brad Robinson
źródło
źródło
Odpowiedzi:
Jeśli po raz pierwszy sprawdzasz repozytorium, musisz
--init
najpierw użyć :W przypadku wersji Git 1.8.2 lub nowszej
--remote
dodano opcję obsługi aktualizacji do najnowszych wskazówek zdalnych gałęzi:Ma to tę dodatkową zaletę, że szanuje dowolne gałęzie „inne niż domyślne” określone w plikach
.gitmodules
lub.git/config
(jeśli tak się dzieje, domyślną wartością jest origin / master, w którym to przypadku niektóre inne odpowiedzi tutaj również działałyby).W przypadku wersji git 1.7.3 lub nowszej możesz użyć (ale poniższe informacje wokół tego, co nadal obowiązuje aktualizacja):
lub:
jeśli chcesz wyciągnąć submoduły do najnowszych zatwierdzeń zamiast bieżącego zatwierdzenia punktów repo.
Zobacz git-submodule (1) szczegóły
źródło
git submodule update --recursive
dzisiaj używać .git submodule foreach "(git checkout master; git pull)&"
origin master
na końcu tego polecenia może przynieść nieoczekiwane rezultaty, jeśli niektóre z podmodułów śledzą inną nazwę gałęzi lub lokalizacji tego konkretnego podmodułu. Oczywiste dla niektórych, ale prawdopodobnie nie dla wszystkich.git submodule update --recursive
sprawdza, która wersja przechowywana jest w repozytorium nadrzędnym dla każdego podmodułu, a następnie sprawdza tę wersję w każdym podmodule. Robi NIE ciągnąć najnowsze rewizje dla każdego modułem.git submodule foreach git pull origin master
lubgit pull origin master --recurse-submodules
jest tym, czego chcesz, jeśli zamierzasz zaktualizować każdy podmoduł do najnowszych z repozytoriów pochodzenia. Tylko wtedy otrzymasz oczekujące zmiany w repozytorium nadrzędnym ze zaktualizowanymi skrótami wersji dla podmodułów. Zamelduj się i jesteś dobry.Dopóki błąd nie zostanie naprawiony, po raz pierwszy musisz uruchomić
źródło
git pull --recurse-submodules
anigit submodule update --recursive
nie nie initialize nowo dodany submodules. Aby je zainicjować, musisz uruchomićgit submodule update --recursive --init
. Cytat z instrukcji : Jeśli podmoduł nie jest jeszcze zainicjowany, a chcesz po prostu użyć ustawienia zapisanego w .gitmodules, możesz automatycznie zainicjować podmoduł za pomocą opcji --init.git submodule update --recursive --remote
której aktualizuje również podmoduły do najnowszej zdalnej wersji zamiast przechowywanego SHA-1.Przy inicjowaniu uruchom następujące polecenie:
z katalogu git repo działa najlepiej dla mnie.
Spowoduje to wyciągnięcie wszystkich najnowszych, w tym podmodułów.
Wyjaśnione
Następnie możesz po prostu uruchomić:
z katalogu git repo działa najlepiej dla mnie.
Spowoduje to wyciągnięcie wszystkich najnowszych, w tym podmodułów.
źródło
Uwaga: pochodzi z 2009 roku i może wtedy było dobrze, ale teraz są lepsze opcje.
Używamy tego. To się nazywa
git-pup
:Po prostu umieść go w odpowiednim katalogu bin (/ usr / local / bin). W systemie Windows konieczna może być modyfikacja składni, aby działała :)
Aktualizacja:
W odpowiedzi na komentarz oryginalnego autora o wciągnięciu wszystkich HEADÓW wszystkich submodułów - to dobre pytanie.
Jestem całkiem pewien, że wewnętrznie
git
nie ma na to polecenia. Aby to zrobić, musisz określić, czym tak naprawdę jest HEAD dla submodułu. To może być tak proste, jak powiedzenie, żemaster
jest to najbardziej aktualna gałąź itp.Następnie utwórz prosty skrypt, który wykonuje następujące czynności:
git submodule status
„zmodyfikowane” repozytoria. Wskazuje na to pierwszy znak linii wyjściowych. Jeśli sub-repo zostanie zmodyfikowane, możesz NIE chcieć kontynuować.git checkout master && git pull
. Sprawdź błędy.Chciałbym wspomnieć, że ten styl nie jest tak naprawdę przeznaczony dla podmodułów git. Zazwyczaj chcesz powiedzieć, że „LibraryX” jest w wersji „2.32” i tak pozostanie, dopóki nie powiem „zaktualizować”.
W pewnym sensie robisz to z opisanym skryptem, ale tylko bardziej automatycznie. Wymagana jest ostrożność!
Aktualizacja 2:
Jeśli korzystasz z platformy Windows, możesz rozważyć użycie Pythona do implementacji skryptu, ponieważ jest on bardzo zdolny w tych obszarach. Jeśli korzystasz z Uniksa / Linuksa, sugeruję tylko skrypt bash.
Potrzebujesz wyjaśnień? Po prostu opublikuj komentarz.
źródło
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
a następnie użyj go jakgit pup
bez skryptów.git submodule init
po pierwszym ściągnięciu z dołączonymi podmodułami, aby wszystko zaczęło działać poprawnie.Henrik jest na dobrej drodze. Polecenie „foreach” może wykonać dowolny dowolny skrypt powłoki. Mogą być dwie opcje pobrania najnowszej wersji,
i,
Spowoduje to iterację wszystkich zainicjowanych podmodułów i uruchomienie podanych poleceń.
źródło
Poniższe działało dla mnie w systemie Windows.
źródło
Edytuj :
W komentarzach wskazano (przez philfreo ), że wymagana jest najnowsza wersja. Jeśli są jakieś zagnieżdżone podmoduły, które muszą być w najnowszej wersji:
----- Nieaktualny komentarz poniżej -----
Czy to nie jest oficjalny sposób na zrobienie tego?
Używam go za każdym razem. Jak dotąd żadnych problemów.
Edytować:
Właśnie odkryłem, że możesz użyć:
Który również rekurencyjnie wyciągnie wszystkie submoduły, tj. Zależności.
źródło
git submodule update --init --recursive
git submodule foreach --recursive git pull
Ponieważ może się zdarzyć, że domyślna gałąź twoich submodułów nie
master
jest, tak automatyzuję pełne aktualizacje Git modułów:źródło
Pierwszy raz
Podmoduł klonowania i inicjowania
Reszta
Podczas programowania wystarczy pobrać i zaktualizować submoduł
Zaktualizuj podmoduł Git do najnowszej wersji zatwierdzenia na początku
Preferowany sposób powinien być poniżej
Uwaga: ostatnie dwa polecenia mają takie samo zachowanie
źródło
git submodule update
załatwiłem sprawę. Teraz pobieram brak danych podmodułów w pierwszym kroku klonowania. Dziękuję Ci. Nie jestem dobry w git: CNie wiem, od której wersji git to działa, ale właśnie tego szukasz:
Używam go również
git pull
do aktualizacji repozytorium głównego:źródło
Powyższe odpowiedzi są dobre, jednak używaliśmy haczyków git, aby to ułatwić, ale okazuje się, że w git 2.14 można ustawić wartość
git config submodule.recurse
true, aby umożliwić aktualizację podmodułów po przejściu do repozytorium git.Będzie to miało efekt uboczny polegający na wypychaniu wszystkich podmodułów, które masz, jeśli są one jednak na gałęziach, ale jeśli potrzebujesz tego zachowania już to może zrobić.
Można to zrobić za pomocą:
źródło
git submodule init
przed ręką, jeśli twój podmoduł nie jest jeszcze zainicjowany.Git dla systemu Windows 2.6.3 :
git submodule update --rebase --remote
źródło
Z najwyższego poziomu w repozytorium:
Spowoduje to zmianę wszystkich gałęzi w celu rozwijania i pobierania najnowszych
źródło
git submodule foreach git pull origin master
Musiałem dołączyć gałąź, którą chciałem pobrać. poza tym działał idealnie.Zrobiłem to poprzez dostosowanie gahooa „s odpowiedź powyżej :
Zintegruj go z git
[alias]
...Jeśli twój projekt nadrzędny ma coś takiego
.gitmodules
:Dodaj coś takiego w .gitconfig
Następnie, aby zaktualizować submoduły, uruchom:
Mam taki przykład w moim repozytorium konfiguracji środowiska .
źródło
Wszystko, co musisz teraz zrobić, to proste
git checkout
Pamiętaj tylko, aby włączyć tę funkcję za pomocą tej globalnej konfiguracji:
git config --global submodule.recurse true
źródło
Oto wiersz polecenia do pobrania ze wszystkich repozytoriów git, niezależnie od tego, czy są one podmodułami:
Jeśli uruchamiasz go w swoim najlepszym repozytorium git, możesz go zamienić
"$ROOT"
na.
.źródło
Myślę, że będziesz musiał napisać skrypt, aby to zrobić. Aby być uczciwym, mogę zainstalować python to zrobić tak, że można użyć
os.walk
docd
każdego katalogu i wydać odpowiednie polecenia. Użycie Pythona lub innego języka skryptowego, innego niż wsadowy, pozwoliłoby na łatwe dodawanie / usuwanie podprojektów bez konieczności modyfikowania skryptu.źródło
Uwaga: niezbyt łatwy sposób, ale wykonalny i ma swoje własne unikalne zalety.
Jeśli chce się sklonować tylko
HEAD
wersję repozytorium i tylkoHEAD
s wszystkich jego podmodułów (tj. Do kasy „trunk”), można użyć następującego skryptu Lua . Czasami proste poleceniegit submodule update --init --recursive --remote --no-fetch --depth=1
może spowodować nieodwracalnygit
błąd. W takim przypadku należy.git/modules
ręcznie wyczyścić podkatalog katalogu i sklonować podmoduł za pomocągit clone --separate-git-dir
polecenia. Jedyną złożonością jest znalezienie adresu URL , ścieżki.git
katalogu submodułu i ścieżki submodułu w drzewie superprojektu.Uwaga: skrypt jest testowany tylko na
https://github.com/boostorg/boost.git
repozytorium. Jego osobliwości: wszystkie submoduły hostowane na tym samym hoście i.gitmodules
zawierają tylko względne adresy URL .źródło