Pytanie Git nie zainicjuje / nie zsynchronizuje / zaktualizuje nowych submodułów


Oto część zawartości mojego .gitmodules plik:

[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 pierwszą:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

Drugi submoduł (external/pyfacebook) został dodany przez innego programistę w gałęzi funkcji. Odziedziczyłem teraz rozwój i sprawdziłem gałąź funkcji. Jednak Git nie wyśle ​​mi modułu częściowego. Próbowałem:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Usuwanie wszystkich definicji modułów z pozycji .git/config i działa git submodule init. Kopiuje tylko poprzednio istniejący moduł częściowy i ignoruje nowy.
  • Wprowadzanie nowych definicji modułów podrzędnych w .git/config ręcznie i działa git submodule update. Tylko poprzednie istniejące moduły są kłopotliwe w aktualizowaniu.

w różnych kombinacjach, ale git po prostu się nie zaktualizuje .git/config w oparciu o nową zawartość .gitmodules, ani nie stworzy external/pyfacebook folder i wyciągnij zawartość modułu.

czego mi brakuje? Jest to interwencja ręczna (ręczne dodanie pozycji modułu do .git/config) naprawdę wymagane i dlaczego?

Edytować: Ręczna interwencja nie działa. Ręczne dodawanie nowego elementu modułu do .git/config nic nie robi. Nowy submoduł jest ignorowany.


76
2017-07-26 16:47


pochodzenie


działa 1.7.7.1 i ma ten sam problem: "Synchronizacja submoduła git" nie aktualizuje pliku .git / config po zmianie na .gitmodules. - James Pritts
Ten artykuł jest pomocny: chrisjean.com/git-submodules-adding-using-removing-and-updating - Igor Ganapolsky


Odpowiedzi:


Czy niedawno zaktualizowałeś git do wersji 1.7.0.4? Zrobiłem i mam teraz podobne problemy ...

Edycja: poprawiłem swój problem, ale absolutnie nie mam pojęcia, gdzie jest problem. Ręcznie usunąłem moduły submodułów zarówno z plików .git / config, jak i .gitmodules i ponownie dodałem swoje submoduły za pomocą kroków użytkownika (git submodule add etc ...) ... Worksforme, ale nie dodaje żadnej wartości do tego wątku.


28
2017-08-26 16:10



W tej chwili mam do 1.7.2, ale uważam, że mam problem od co najmniej 1.6.x. - David Eyk
I tak, pomyśl o tym, skończyło się na tym, że muszę to zrobić, jak opisujesz (zapomniałem, że to pytanie było wciąż otwarte!). Jeśli nie masz nic przeciwko polerowaniu odpowiedzi, zaakceptuję to. - David Eyk
Jest to ciągła słabość gita. Nawet svn jest lepszy z zewnętrznymi. - Peter DeWeese
Myślę, że właśnie w to wpadłem (te same kroki zdają się wreszcie naprawiać). Zauważyłem tylko, że po dodaniu go ponownie, po zatwierdzeniu, zatwierdzenie powiedziało: stworzyć tryb 160000 lib / jruby-swing-helpers (huh?) - rogerdpack
O "trybie tworzenia 160000" książka Pro Git mówi: "Zwróć uwagę na tryb 160000 dla wpisu w stelażu.To jest specjalny tryb w Git, który oznacza po prostu zapisywanie zatwierdzenia jako wpisu do katalogu zamiast podkatalogu lub plik." git-scm.com/book/en/Git-Tools-Submodules - Johann


Miałem ten sam problem - okazało się, że plik .gitmodules został zatwierdzony, ale faktyczne zatwierdzenie modułu (tj. Rekordu ID zatwierdzania modułu pomocniczego) nie było.

Dodanie go ręcznie zdawało się robić lewy - np .:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(Nawet bez usuwania czegokolwiek z .git / config lub .gitmodules.)

Następnie zatwierdz go, aby prawidłowo zarejestrować identyfikator.

Dodanie kolejnych komentarzy do tej działającej odpowiedzi: Jeśli aktualizacja modułu kodu init lub modułu git nie działa, to jak opisano powyżej, moduł dodawania adresu git powinien wystarczyć. Można to sprawdzić przez

 git config --list

i należy uzyskać wpis modułu częściowego, który chcesz pobrać w wyniku polecenia git config -list. Jeśli w podmiale konfiguracyjnym znajduje się wpis Twojego submodułu, to teraz zwykła aktualizacja modułu modułu - powinna ciągnąć twój moduł. Aby przetestować ten krok, możesz ręcznie zmienić nazwę modułu, a następnie zaktualizować moduł.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Aby dowiedzieć się, czy masz lokalne zmiany w module podległym, możesz zobaczyć go poprzez status git -u (jeśli chcesz zobaczyć zmiany w module częściowym) lub status git --ignore-submoduły (jeśli nie chcesz widzieć zmian w moduł podrzędny).


64
2018-01-28 23:58



Co jest external/pyfacebook dla? - Igor Ganapolsky
@IgorGanapolsky To jest docelowa ścieżka dla Twojego modułu. - yuhua
To mi pomogło, wielkie dzięki! Mógłbym tylko dodać, że jeśli ścieżka docelowa już istnieje (co zrobiła dla mnie w wyniku wypróbowania innych poleceń) otrzymujemy następujący komunikat, który tylko dodaje zamieszania: 'your/local/path' already exists and is not a valid git repo - Michael Ambrus
jedna linijka do odczytu wpisów w "git config --list": git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash - Puggan Se


Wersja git 2.7.4. Ta komenda aktualizuje kod lokalny git submodule update --init --force --remote


36
2017-11-21 11:15



Nic dla mnie nie robiąc. - Carlo Wood
w odniesieniu do modułu-git [dokumentacja] (git-scm.com/docs/git-submodule#git-submodule---remote) powyższa komenda powinna zaktualizować lokalny oddział submodułów. - palik


Miałem ten sam problem, gdy git był ignorowany init i update komendy i nic nie robi.

JAK NAPRAWIĆ

  1. Twój moduł submoduły powinien zostać zatwierdzony do repozytorium git
  2. Nie powinno być w .gitignore

Jeśli te wymagania się spełnią, będzie działać. W przeciwnym razie wszystkie polecenia będą wykonywane bez żadnych komunikatów i rezultatów.

Jeśli zrobiłeś to wszystko i nadal nie działa:

  1. Dodaj ręcznie moduł dodatkowy, np. git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. Zatwierdź i przesuń wszystkie pliki - .gitmodules i folder twojego modułu (zauważ, że zawartość folderu nie zostanie zatwierdzona)
  5. upuść lokalne repozytorium git
  6. sklonuj nowy
  7. Upewnij się, że .git/config nie ma jeszcze żadnych submodułów
  8. Teraz, git submodule init - a zobaczysz komunikat, że moduł został zarejestrowany
  9. git submodule update - pobierze moduł
  10. Teraz spójrz na .git/config i znajdziesz zarejestrowany submoduł

14
2017-10-27 13:45



git submodule add git @ ... path / to - zrobił dla mnie sztuczkę - Amit Yatagiri


W magiczny sposób, ale dziś uciekłem git submodule init śledzony przez    git submodule sync śledzony przez git submodule update i to się zaczęło   wyciągając moje submodules ... Magic? Być może! To naprawdę jedna z najbardziej   irytujące doświadczenia z Git ...

Zdrap to. Właściwie to działa git submodule update --init --recursive. Mam nadzieję że to pomoże.

PS: Upewnij się, że znajdujesz się w głównym katalogu git, a nie w module podległym.


3
2018-05-19 01:10



Nah to absolutnie nic dla mnie. - Igor Ganapolsky
@IgorGanapolsky Redagowałem powyższą odpowiedź z tym, co sprawdziło się u mnie. Daj znać czy działa! - Levi Figueira
Próbowałem twoich nowych poleceń, ale oni też nic nie zrobili. - Igor Ganapolsky
Meh, to nie zadziała. - adi518


Wydaje się, że w odpowiedziach jest również wiele zamieszania.

git submodule init jest nie przeznaczone do magicznego generowania rzeczy w .git / config (z .gitmodules). Ma to na celu ustawienie czegoś w całkowicie pustym podkatalogu po sklonowaniu projektu nadrzędnego lub wyciągnięcie zatwierdzenia, które dodaje wcześniej nieistniejący moduł podrzędny.

Innymi słowy, podążaj za git clone projektu, który ma submoduły (które poznasz dzięki temu, że klon sprawdził plik .gitmodules) przez git submodule update --init --recursive.

Ty robisz nie śledzić git submodule add ... z a git submodule init (lub git submodule update --init), to nie powinno działać. W rzeczywistości, dodatek będzie już aktualizował odpowiednią .git / config, jeśli coś działa.

EDYTOWAĆ

Jeśli poprzednio nieistniejący moduł kodu Git został dodany przez kogoś innego, a ty wykonujesz a git pull tego zatwierdzenia, wówczas katalog tego modułu będzie całkowicie pusty (po uruchomieniu) git submodule status nowy hash modułu musi być widoczny, ale będzie miał - przed nim.) W tym przypadku musisz podążać za swoim git pull także z a git submodule update --init (plus --recursive gdy jest to submoduł w module częściowym), aby uzyskać sprawdzenie nowego, wcześniej nieistniejącego modułu podrzędnego; podobnie jak po pierwszym sklonowaniu projektu z submodułami (gdzie oczywiście nie miałeś tych submodułów przed każdym z nich).


3
2017-12-27 17:52



To interesujące, ponieważ git help submodule mówi o init: "init: Zainicjuj submoduły zapisane w indeksie (które zostały dodane i zatwierdzone gdzie indziej), kopiując nazwy modułów i adresów URL z .gitmodules do .git / config." Więc na pewno Dźwięki tak jak powinien robić dokładnie to, co mówisz, że nie działa ...? Czas na aktualizację dokumentacji git? - Brad
@brad Nie sądzę, żebym to powiedział - ale dodałem wyjaśnienie do tego konkretnego przypadku. Dzięki. - Carlo Wood
@ CarloWood każdy pomysł, dlaczego pisarze z podmodeli Git zdecydował, że --init powinno być konieczne, aby uzyskać nowe submoduły (zamiast chwytania ich automatycznie) update)? Wygląda na to, że aktualizacja repozytorium powinna zabrać wszystko, co konieczne, chyba że zniszczy dane. Z --init zmusza cię do odkrycia, że ​​mogły powstać nowe submoduły, lub po prostu zawsze wyślij --init za każdym razem wydaje się, że powinien on być domyślnie włączony. - Catskul
@Catskul Oczywiście nie mam pojęcia, dlaczego autorzy submodułów git zdecydowali cokolwiek, ale domyślam się, że "aktualizacja" jest zarezerwowana dla aktualizacji czegoś, co już istnieje, a "init" służy do tworzenia czegoś (lokalnie) nowego. Pod maską te dwa są prawdopodobnie na tyle różne, by uzasadnić inne polecenie. - Carlo Wood


Zgodnie z odpowiedzią Dave'a Jamesa Millera mogę potwierdzić, że zadziałało to dla mnie. Ważne było, aby zatwierdzić identyfikator podprojektów. Wystarczy, że wpis w .gitmodules nie wystarczy.

Oto odpowiednie zatwierdzenie:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae


2
2017-07-15 15:03





Miałem ten sam problem.

.gitmodules miał submoduł, ale po a git submodule init rozkaz, że go nie ma .git/config.

Okazuje się, że programista, który dodał moduł, dodał także katalog modułów modułów do .gitignore plik. To nie działa.


2
2018-01-28 03:44





Tak samo jak ty odkryłeś, że synchronizacja submodule git nie robi tego, czego się spodziewasz. Tylko po wykonaniu wyraźnego git submodule addponownie zmienia się adres podmodułu.

Więc umieściłem ten skrypt w ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

Używam również tej samej logiki w kilku skryptach wdrażania git po otrzymaniu.

Wszystko, co muszę teraz zrobić, to edycja .gitmodules, następnie uruchom ten skrypt i w końcu działa tak, jak myślałem git submodule sync powinien.


2
2018-03-09 19:36



To faktycznie działa. - JeffCharter
Wydaje się, że dzieje się tak tylko w przypadku niektórych repo ... prawdopodobnie z powodu jakiegoś błędu w Git. To mi się nie przydarzyło nowo tworzone repozytoria przez długi czas, ale wracając, kiedy zdarzało się cały czas na niektórych repo ... - fridh