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.

znak
źródło
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
Mathias Bynens
źródło
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
3
@NHDaly wydaje się, że nie: stackoverflow.com/questions/4251940/...
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
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
LiraNuna
źródło
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.

VonC
źródło
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
Javier C.
źródło
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>
Mars Redwyne
źródło
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.

nweiler
źródło
37
Pamiętaj, że --recurse-submodulesi --recursiverównoważnymi aliasami .
Joel Purra
@SuperUberDuper w takim przypadku możesz zrobić git submodule update --init --recursivetak , jak wyjaśniono w tej odpowiedzi
Enrico
25

Myślę, że możesz przejść 3 kroki:

git clone
git submodule init
git submodule update
Muhammad Ali e
źródło
21

spóźniona odpowiedź

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://[email protected]/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

kajzer
źródło
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
radhey shyam
źródło
18

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

git clone --recursive [email protected]: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"
Ahmad Azimi
źródło
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
Benyamin Jafari
źródło
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

Długi Nguyen
źródło
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.

Błąd krytyczny
źródło
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.

Himeshika96
źródło
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
nzrytmn
źródło