Oto część zawartości mojego .gitmodules
pliku:
[submodule "src/static_management"]
path = src/static_management
url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
path = external/pyfacebook
url = http://github.com/sciyoshi/pyfacebook.git
Jednak .git/config
zawiera tylko pierwszy:
[submodule "src/static_management"]
url = git://github.com/eykd/django-static-management.git
Drugi moduł podrzędny ( external/pyfacebook
) został dodany przez innego programistę w gałęzi funkcji. Odziedziczyłem teraz rozwój i sprawdziłem gałąź funkcji. Jednak Git nie ściągnie dla mnie modułu podrzędnego. Próbowałem:
git submodule init
git submodule update
git submodule update --init
git submodule sync
- Usunięcie wszystkich definicji podmodułów z
.git/config
i uruchomieniegit submodule init
. Kopiuje tylko poprzednio istniejący moduł podrzędny i ignoruje nowy. .git/config
Ręczne wprowadzanie nowych definicji podmodułów i uruchamianiegit submodule update
. Aktualizacją zajmują się tylko istniejące wcześniej moduły podrzędne.
w różnych kombinacjach, ale git po prostu nie zaktualizuje się .git/config
na podstawie nowej zawartości .gitmodules
, ani nie utworzy external/pyfacebook
folderu i nie pobierze zawartości modułu podrzędnego.
czego mi brakuje? Czy ręczna interwencja (ręczne dodanie wpisu podmodułu .git/config
) jest naprawdę wymagana i dlaczego?
Edycja: ręczna interwencja nie działa. Ręczne dodanie nowego wpisu podmodułu do .git/config
nic nie daje. Nowy moduł podrzędny jest ignorowany.
źródło
Odpowiedzi:
Miałem ten sam problem - okazało się, że plik .gitmodules został zatwierdzony, ale faktyczne zatwierdzenie submodułu (czyli zapis ID zatwierdzenia submodułu) nie.
Dodanie go ręcznie zdawało się załatwić sprawę - np:
(Nawet bez usuwania czegokolwiek z .git / config lub .gitmodules.)
Następnie zatwierdź go, aby poprawnie zapisać identyfikator.
Dodanie dalszych komentarzy do tej roboczej odpowiedzi: Jeśli podmoduł git init lub aktualizacja submodułu git nie działa, to zgodnie z powyższym podmoduł git add url powinien załatwić sprawę. Można to sprawdzić krzyżowo
i należy uzyskać wpis podmodułu, który chcesz pobrać w wyniku wykonania polecenia git config --list. Jeśli w wyniku konfiguracji znajduje się wpis twojego modułu podrzędnego, to teraz zwykła aktualizacja modułu podrzędnego git --init powinna wyciągnąć moduł podrzędny. Aby przetestować ten krok, możesz ręcznie zmienić nazwę modułu podrzędnego, a następnie zaktualizować moduł podrzędny.
Aby dowiedzieć się, czy masz lokalne zmiany w module podrzędnym, możesz je zobaczyć za pomocą git status -u (jeśli chcesz zobaczyć zmiany w module podrzędnym) lub git status --ignore-submodules (jeśli nie chcesz widzieć zmian w podmoduł).
źródło
external/pyfacebook
?'your/local/path' already exists and is not a valid git repo
git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
git w wersji 2.7.4. To polecenie aktualizuje kod lokalny
git submodule update --init --force --remote
źródło
git submodule update --init --force --remote <module-name>
.Miałem ten sam problem, gdy git ignorował
init
iupdate
polecenia, i nic nie robi.JAK NAPRAWIĆ
Jeśli te wymagania zostaną spełnione, będzie działać. W przeciwnym razie wszystkie polecenia zostaną wykonane bez żadnych komunikatów i wyników.
Jeśli zrobiłeś to wszystko i nadal nie działa:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
i folder modułu (pamiętaj, że zawartość folderu nie zostanie zatwierdzona).git/config
nie ma jeszcze żadnych modułów podrzędnychgit submodule init
- i zobaczysz komunikat, że moduł został zarejestrowanygit submodule update
- pobierze moduł.git/config
a znajdziesz zarejestrowany podmodułźródło
Wydaje się, że w odpowiedziach (również) jest wiele nieporozumień.
git submodule init
jest nie przeznaczony do generowania magiczną rzeczy w .git / konfiguracji (od .gitmodules). Jego celem jest ustawienie czegoś w całkowicie pustym podkatalogu po sklonowaniu projektu nadrzędnego lub ściągnięciu zatwierdzenia, które dodaje wcześniej nieistniejący moduł podrzędny.Innymi słowy, podążasz za
git clone
projektem, który ma podmoduły (które poznasz po tym, że klon pobrał plik .gitmodules) przez rozszerzeniegit submodule update --init --recursive
.Zdajesz nie postępować
git submodule add ...
zgit submodule init
(lubgit submodule update --init
), że nie ma pracy. W rzeczywistości dodatek będzie już aktualizował odpowiedni plik .git / config, jeśli coś działa.EDYTOWAĆ
Jeśli wcześniej nieistniejący podmoduł git został dodany przez kogoś innego i wykonasz takie
git pull
zatwierdzenie, katalog tego modułu podrzędnego będzie całkowicie pusty (podczas wykonywaniagit submodule status
nowego modułu podrzędnego hash powinien być widoczny, ale będzie miał-
przed it.) W takim przypadku musisz również podążać za swoimgit pull
równieżgit submodule update --init
(plusem,--recursive
jeśli jest to podmoduł wewnątrz podmodułu), aby pobrać nowy, wcześniej nieistniejący podmoduł wyewidencjonowany; tak jak po początkowym sklonowaniu projektu z podmodułami (gdzie oczywiście nie miałeś tych podmodułów wcześniej).źródło
git help submodule
mówi tak o init: "init: Zainicjuj podmoduły zapisane w indeksie (które zostały dodane i zatwierdzone w innym miejscu), kopiując nazwy i adresy URL podmodułów z .gitmodules do .git / config." Więc na pewno brzmi, że powinien robić dokładnie to, co mówisz, że nie robi ...? Czas na aktualizację dokumentacji gita?--init
powinno być konieczne uzyskanie nowych modułów podrzędnych (zamiast pobierać je automatycznieupdate
)? Wygląda na to, że aktualizacja repozytorium powinna pobrać wszystko, co konieczne, chyba że zniszczyłaby dane. Dzięki--init
niemu musisz wiedzieć, że mogły zostać utworzone nowe podmoduły, lub po prostu zawsze generować a za--init
każdym razem, w takim przypadku wydaje się, że powinien być domyślnie włączony.Miałem ten sam problem, ale żadne z powyższych rozwiązań nie pomogło. Wpisy w .gitmodules i .git / config były prawidłowe, ale polecenie
git submodules update --init --recursive
nic nie robiło. Usunąłem również katalog podmodułów, uruchomiłemgit submodules update --init --recursive
i odzyskałem katalog podmodułów, ale z dokładnie takim samym zatwierdzeniem jak poprzednio.Znalazłem odpowiedź na tej stronie . Polecenie to:
git submodule update --remote
źródło
git submodule update
Zamiast tego biegałemgit submodule update --remote
.Podrap to. Właściwie udało mi się to przez działanie
git submodule update --init --recursive
. Mam nadzieję że to pomoże.PS: Upewnij się, że jesteś w głównym katalogu git, a nie w module podrzędnym.
źródło
Myślenie, że
.gitmodules
wystarczy ręczna konfiguracja , jest NIEPOPRAWNEMój lokalny
git version 2.22.0
w chwili pisania tego tekstu.Więc doszedłem do tego wątku, zastanawiając się, dlaczego nie
git submodule init
działa; Skonfigurowałem.gitmodules
plik i przystąpiłem dogit submodule init
...WAŻNY
git submodule add company/project.git includes/project
jest wymagane (przy pierwszym dodawaniu modułu), spowoduje to:.git/config
.gitmodules
plikincludes/project
w tym przykładzie).Państwo musi następnie
git commit
po dodaniu submodule, to popełni.gitmodules
i gąsienicowym lokalizacja modułem.Gdy projekt zostanie ponownie sklonowany, będzie miał
.gitmodules
pusty katalog modułów podrzędnych (np.includes/project
W tym przykładzie). W tym momencie.git/config
nie ma jeszcze konfiguracji podmodułu, dopóki niegit submodule init
zostanie uruchomiony, i pamiętaj, że działa to tylko dlatego, że.gitmodules
ANDincludes/project
są śledzone w głównym repozytorium git.Zobacz także:
źródło
Zgodnie z odpowiedzią Dave'a Jamesa Millera mogę potwierdzić, że to zadziałało. Ważną rzeczą tutaj było zatwierdzenie identyfikatora zatwierdzenia podprojektów. Samo posiadanie wpisu w .gitmodules nie wystarczyło.
Oto odpowiednie zatwierdzenie:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
źródło
Miałem ten sam problem.
.gitmodules
miał moduł podrzędny, ale pogit submodule init
poleceniu go nie było.git/config
.Okazuje się, że programista, który dodał moduł podrzędny, dodał również katalog podmodułu do
.gitignore
pliku. To nie działa.źródło
Tak jak Ty, odkryłem, że synchronizacja modułu podrzędnego git nie robi tego, czego oczekujesz. Dopiero po
git submodule add
ponownym wykonaniu jawnego adresu URL modułu podrzędnego zmienia się.Więc umieściłem ten skrypt w
~/bin/git-submodule-sync.rb
:https://gist.github.com/frimik/5125436
Używam też tej samej logiki w kilku skryptach wdrażania git po otrzymaniu.
Wszystko, co teraz muszę zrobić, to edytować
.gitmodules
, a następnie uruchomić ten skrypt i w końcu działa tak, jak myślałem, żegit submodule sync
powinien.źródło
Miałem dziś ten sam problem i doszedłem do wniosku, że ponieważ wpisałem
git submodule init
wtedy, miałem te linie w moim.git/config
:Usunąłem to i wpisałem:
I wszystko wróciło do normy, mój podmoduł jak zwykle zaktualizowany w swoim podkatalogu.
źródło
Problem dla mnie polega na tym, że poprzedni programista repozytorium zatwierdził
submodules/thing
folder jako zwykły folder, co oznacza, że kiedy próbowałem uruchomićgit submodule add ...
, nie powiodło się z:'submodules/thing' already exists in the index
:, ale próba zaktualizowania modułu podrzędnego również zakończy się niepowodzeniem, ponieważ zobaczył, że ścieżka nie zawierają podmoduł.Aby to naprawić, musiałem usunąć
submodules/thing
folder, zatwierdzić usunięcie, a następnie uruchomićgit submodule add
polecenie, aby dodać go z powrotem poprawnie:źródło
Kiedy zobaczyłem to dzisiaj, programista przeniósł część drzewa do nowego podkatalogu i wygląda na to, że jego klient git nie zarejestrował zaktualizowanych reguł podprojektu w drzewie, zamiast tego zostały po prostu nukowane, pozostawiając
.gitmodules
odwołanie do nieaktualnych lokalizacje i podprojekty, które już nie istnieją w bieżącym drzewie.Dodanie modułów podrzędnych z powrotem i porównanie zatwierdzeń shas modułu podrzędnego z tymi znalezionymi w
git show $breaking_commit_sha
(wyszukaj wiersze pasujące^-Subproject
do wyrażenia regularnego ) w celu dostosowania do potrzeb naprawiono rzeczy.źródło
Usunięcie katalogu podmodułu i jego zawartości (folder „zewnętrzny / pyfacebook”), jeśli istniał wcześniej,
git submodule add ...
może rozwiązać problemy.źródło
Miałem podobny problem z submodułem. Po prostu nie chciał być klonowany / ściągany / aktualizowany / cokolwiek.
Podczas próby ponownego dodania modułu podrzędnego za pomocą
git submodule add [email protected] destination
otrzymałem następujące dane wyjściowe:Próbowałem więc wymusić polecenie dodawania :
git submodule add --force [email protected] destination
To zadziałało w moim przypadku.
źródło
Dla przypomnienia:
ten sam problem utworzyłem, dodając puste repozytorium jako moduł podrzędny. W tym przypadku nie było dostępnego skrótu referencyjnego dla podmodułu, co doprowadziło do błędu opisanego przez oryginalny plakat.
Wymuszenie dodania repozytorium po zatwierdzeniu go rozwiązało problem (jak w poście Arvids)
git submodule add --force [email protected] destination
źródło
.git/config
git submodule init
poleceniegit pull origin master
Powinno teraz działać
źródło
Po prostu dzielę się tym, co zadziałało dla mnie:
Powoduje to sklonowanie zdalnego repozytorium zawierającego już moduły podrzędne. Oznacza to, że po sklonowaniu nie trzeba uruchamiać aktualizacji modułu podrzędnego git ani inicjować go.
źródło
Poniższe polecenie synchronizacji rozwiązało problem:
źródło