Jak „git clone”, w tym submoduły?


1990

Próbuję umieścić submoduł w repozytorium. Problem polega na tym, że kiedy klonuję repozytorium nadrzędne, folder submodułu jest całkowicie pusty.

Czy jest jakiś sposób, aby to tak, że git clone parent_repofaktycznie umieszcza dane w folderze submodułu?

Na przykład http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativewskazuje na zewnętrzny submoduł git, ale kiedy kasuję sequelizeprojekt, ten folder jest pusty.


4
Poleceniem byłoby git clone --recurse-submodules --remote-submodules(G3 2.23): sklonuje i zaktualizuje submoduły w jednym poleceniu. Zobacz moją zredagowaną odpowiedź poniżej .
— VonC

Odpowiedzi:


2975

W wersji 2.13 Git i późniejszych --recurse-submodulesmożna używać zamiast --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

Uwaga edytora: -j8jest opcjonalną optymalizacją wydajności, która stała się dostępna w wersji 2.8 i pobiera do 8 podmodułów jednocześnie - patrz man git-clone.

W wersji 1.9 Git do wersji 2.12 ( -jflaga dostępna tylko w wersji 2.8+):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

W wersji 1.6.5 Git i nowszych możesz używać:

git clone --recursive git://github.com/foo/bar.git
cd bar

W przypadku już sklonowanych repozytoriów lub starszych wersji Git użyj:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

122
Czy istnieje sposób, aby określić takie zachowanie jako domyślne w repozytorium git, aby mniej poinformowani klonujący automatycznie otrzymali zainicjowany podmoduł?
— NHDaly,

11
@NHDaly Niestety nie. (Nie o tym przynajmniej wiem.)
— Mathias Bynens,

6
Logicznie myślący klon git - recursive zapełni również wszelkie podmoduły tego podmodułu, prawda?
— jayarjo


5
@toszter: czy to takie mądre? Co jeśli repozytorium wstrzymujące potrzebuje wersji submodułu, która nie jest master?
— Gauthier

498

Musisz wypełnić dwie rzeczy, zanim podmoduł zostanie wypełniony:

git submodule init 
git submodule update

8
Bałam się tego ... to nie ma sensu, ponieważ w takim przypadku sprawdzasz częściowy projekt. Rozumiem, że aktualizacje podmodułów nie są automatyczne, ale dlaczego powiązana wersja nie jest automatycznie sprawdzana? Czy jest jakiś sposób, aby to zmusić? Mam projekt z 3 poziomami submodułów i wydaje się absurdem, że muszę jechać tak daleko tylko po to, żeby zrobić kasę.
— Mark

10
Przeczytaj git-submodule(1)stronę podręcznika ( kernel.org/pub/software/scm/git/docs/git-submodule.html ). Dowiesz się, że git submodule updateobsługuje ładny parametr o nazwie --recursive.
— joschi

94
Dlaczego nie zrobić obu w jednym poleceniu? git submodule update --init(Zobacz także moją odpowiedź ).
— Mathias Bynens,

9
Myślę, że lepiej odpowiedzieć na pytanie za pomocą tych dwóch poleceń. To lepiej wyjaśnia, jak wykonać zadanie.
— schmijos

6
@MathiasBynens Maszyna, na którą właśnie się zalogowałem, ma tylko git 1.5.5.6, który najwyraźniej nie obsługuje skróconej instrukcji, ale obsługuje ją jako dwie komendy.
— Jack Poulson

220

Git 2.23 (III kwartał 2019): jeśli chcesz sklonować i zaktualizować submoduły do ​​ich najnowszej wersji:

git clone --recurse-submodules --remote-submodules

Jeśli chcesz je tylko sklonować na nagranym SHA1:

git clone --recurse-submodules

Patrz poniżej.


Oryginalna odpowiedź 2010

Jak joschi wspomina w komentarzach, git submoduleobsługuje teraz --recursiveopcję (Git1.6.5 i więcej).

Jeśli --recursivejest określony, to polecenie będzie się powtarzało w zarejestrowanych podmodułach i aktualizuje wszystkie zagnieżdżone podmoduły w nim.

Zobacz Praca rekurencyjnie z podmodułami git dla części początkowej.
Zobacz git submodulewyjaśnienie, aby uzyskać więcej.

W wersji 1.6.5 git i nowszych możesz to zrobić automatycznie, klonując super-projekt z –-recursiveopcją:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

Aktualizacja 2016 z git 2.8: patrz „ Jak przyspieszyć / zrównoleglić pobieranie podmodułów git za pomocą git clone --recursive? ”

Możesz zainicjować pobieranie submodułu przy użyciu wielu wątków równolegle.
Na przykład:

git fetch --recurse-submodules -j2

Co więcej, dzięki Git 2.23 (III kwartał 2019 r.) Możesz klonować i pobierać moduły podrzędne do ich gałęzi śledzenia za pomocą jednego polecenia!

Zobacz zatwierdzenie 4c69101 (19 maja 2019 r.), Autor: Ben Avison ( bavison) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 9476094 , 17 czerwca 2019)

clone: dodaj --remote-submodulesflagę

Podczas używania git clone --recurse-submoduleswcześniej nie było możliwości przekazania --remoteprzełącznika do domyślnej git submodule updatekomendy dla dowolnego przypadku użycia, w którym chcesz, aby submoduły były sprawdzane w ich gałęzi zdalnego śledzenia, a nie z SHA-1 zarejestrowanym w superprojekcie.

Ta poprawka naprawia tę sytuację.
To faktycznie przechodzi --no-fetchsię git submodule updatetakże na gruncie one modułem dopiero sklonowano, więc ściągam z pilota ponownie służy jedynie spowolnić.

To znaczy:

--[no-]remote-submodules:

Wszystkie sklonowane submoduły będą używać statusu gałęzi zdalnego śledzenia submodułu do aktualizacji submodułu, a nie zarejestrowanego SHA-1 superprojektu. Odpowiednik przejścia --remotedo git submodule update.


3
Git potrzebował 14 lat, aby zacząć dodawać odpowiednie wsparcie dla podmodułów, huh. Dziękuję za aktualizację! Co jeśli mam już klon głównego repozytorium bez podmodułów i bez nagranego SHA1, i chcę pobrać najnowszą wersję każdego podmodułu. Czy to wykonalne?
— Violet Giraffe

1
@ VioletGiraffe Jeśli to sklonowane repozytorium ma podmoduły, „nagrało SHA1”. I git submodule update --init --recursive --remotepowinien zaktualizować je do najnowszego zatwierdzenia w swoim oddziale. (np .: stackoverflow.com/a/56981834/6309 )
— VonC

1
Pozwól mi wyjaśnić na przykładzie: Mam projekt szablonu na Github, który używa submodułów, a nawet popełniłem określone wersje submodułów w tym repozytorium szablonów. Ale kiedy tworzę nowy projekt z tego repozytorium, żadne z wymienionych poleceń (ani clone --recurse-submodules --remote-submodulesnor submodule update --init --recursive --remote) nie pozwala mi pobrać podrep. Wszystko, co dostaję, to plik .gitmodules i nie mogłem znaleźć innego sposobu na zainicjowanie subrepos niż ręczne klonowanie ich jeden po drugim. Chciałbym mieć przynajmniej skrypt do zrobienia tego z submodule foreach...
— Violet Giraffe

Jeśli znasz rozwiązanie, zadam osobne pytanie, na które możesz odpowiedzieć. Oto repozytorium testowe, w którym nie mogę znaleźć innego sposobu na inicjację niż ręcznie: github.com/VioletGiraffe/TEST
— Violet Giraffe

@VioletGiraffe To dlatego, że dodałeś i zatwierdziłeś .gitmodules, ale nie gitlink ( stackoverflow.com/a/16581096/6309 , specjalne wpisy w indeksie: stackoverflow.com/a/19354410/6309 ) Oto repozytorium, które mieć zarejestrowane prawidłowe gitlink: github.com/tiagomazzutti/antlr4dart
— VonC

108

[Szybka odpowiedź]

Możesz użyć tego polecenia, aby sklonować swoje repozytorium ze wszystkimi podmodułami:

git clone --recursive YOUR-GIT-REPO-URL

Lub jeśli już sklonowałeś projekt, możesz użyć:

git submodule init
git submodule update

33

Jeśli twój podmoduł został dodany do gałęzi, pamiętaj o dołączeniu go do polecenia klonowania ...

git clone -b <branch_name> --recursive <remote> <directory>

To było bardziej to, czego szukałem ... ale podmoduły wymieniają swoją gałąź jako „odłączoną”. :(
— AceFunk

28

Spróbuj tego:

git clone --recurse-submodules

Automatycznie pobiera dane z submodułu, zakładając, że już dodałeś submoduły do ​​projektu nadrzędnego.


37
Pamiętaj, że --recurse-submodulesi --recursivesą równoważnymi aliasami .
— Joel Purra

@SuperUberDuper w takim przypadku możesz zrobić git submodule update --init --recursivetak , jak wyjaśniono w tej odpowiedzi
— Enrico


21

spóźniona odpowiedź

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

Ponieważ spędziłem całą godzinę na zabawie z przyjacielem: Nawet jeśli masz uprawnienia administratora do BitBucket, zawsze klonuj ORYGINALNE repozytorium i używaj hasła tego, kto jest właścicielem repozytorium. Irytujące, aby dowiedzieć się, że wpadłeś na tę minetrapę: P


Właśnie z tym mam do czynienia. Czy więc mówisz, że każdy, kto musi opracować repozytorium bitbucket z podmodułami, musi użyć poświadczeń twórcy repozytorium? Blech.
— jsleuth

@ jsleuth Wydaje się, że - to do bani DUŻY CZAS ... i wiem o tym.
— kaiser

To brzmi jak błąd. Zgłosiłeś to do Bitbucket?
— Mathias Bynens,

@MathiasBynens Czy natknąłeś się na ten problem? Minęło półtora roku i właściwie nie wiem, czy nadal tak jest.
— kaiser

4
Nie odpowiada opisowo na pytanie PO, ale szczegółowo opisuje niepowiązany błąd w Bitbucket; które, nawiasem mówiąc, można by po prostu skrócić, aby „użyć uwierzytelniania klucza SSH”.
— Treffynnon

18

Wypróbuj to, aby dołączyć submoduły do ​​repozytorium git.

git clone -b <branch_name> --recursive <remote> <directory>

lub

git clone --recurse-submodules

18

Możesz użyć --recursiveflagi podczas klonowania repozytorium. Ten parametr zmusza git do klonowania wszystkich zdefiniowanych podmodułów w repozytorium.

git clone --recursive git@repo.org:your_repo.git

Po klonowaniu czasami gałęzie podmodułów mogą zostać zmienione, więc uruchom następującą komendę:

git submodule foreach "git checkout master"

17

[Szybka odpowiedź]

Po sklonowaniu repozytorium nadrzędnego (które zawierało repozytorium podmodułu), wykonaj następujące czynności:

git submodule update --init --recursive

11

Pobieranie równoległe submodułów ma na celu skrócenie czasu potrzebnego na pobranie repozytoriów i wszystkich powiązanych z nim podmodułów poprzez umożliwienie pobierania wielu repozytoriów jednocześnie. Można tego dokonać za pomocą nowej opcji --jobs, np .:

git fetch --recurse-submodules --jobs=4

Według zespołu Git może to znacznie przyspieszyć aktualizację repozytoriów zawierających wiele podmodułów. Gdy używasz --recurse-submodules bez nowej opcji --jobs, Git będzie pobierał submoduły jeden po drugim.

Źródło: http://www.infoq.com/news/2016/03/git28-released


8

Miałem ten sam problem z repozytorium GitHub. Na moim koncie brak klucza SSH. Proces jest

  1. Wygeneruj klucz SSH
  2. Dodanie nowego klucza SSH do konta GitHub

Następnie możesz sklonować repozytorium za pomocą submodules ( git clone --recursive YOUR-GIT-REPO-URL)

lub

Uruchom git submodule initi git submodule updatepobierz podmoduły w już sklonowanym repozytorium.


Tak, to jest Permission denied (publickey). fatal: Could not read from remote repository.błąd
— Ender

5

Spróbuj tego.

git clone -b <branch_name> --recursive <remote> <directory>

Jeśli dodałeś podmoduł w gałęzi, upewnij się, że dodałeś go do polecenia klonowania.


5

Jeśli jest to nowy projekt, możesz to zrobić w następujący sposób:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

Jeśli jest już zainstalowany niż:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.