Alt modülleri içeren “git klonu” nasıl yapılır?


1991

Bir repoya bir alt modül yerleştirmeye çalışıyorum. Sorun, üst repo klonlamak, alt modül klasörü tamamen boş olmasıdır.

git clone parent_repoVerileri alt modül klasörüne koyacak şekilde yapmanın bir yolu var mı ?

Örneğin, http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativeharici git altmodülün işaret, ancak zaman ben kontrol sequelizeprojeyi, yani klasör boş.


4
Bu komut git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23) olacaktır: bir modülde alt modları klonlayacak ve güncelleyecektir . Bkz aşağıda benim Düzenlenen cevabı .
VonC

Yanıtlar:


2975

Git ve sonraki sürümlerin 2.13 sürümü ile --recurse-submodulesaşağıdakiler yerine kullanılabilir --recursive:

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

Editörün notu: -j82.8 sürümünde sunulan isteğe bağlı bir performans optimizasyonudur ve bir seferde 8 adede kadar alt modülü getirir - bkz man git-clone.

-jGit'in 1.9 sürümü ile 2.12 sürümüne kadar ( bayrak yalnızca 2.8+ sürümünde mevcuttur):

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

Git ve sonraki sürümlerin 1.6.5 sürümü ile şunları kullanabilirsiniz:

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

Zaten klonlanmış depolar veya daha eski Git sürümleri için şunları kullanın:

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

123
Git deponuzda bu davranışı varsayılan olarak belirtmenin herhangi bir yolu var mı, böylece daha az bilgili klonlayıcılar otomatik olarak başlatılan bir alt modül alacak mı?
NHDaly

11
@NHDaly Ne yazık ki hayır. (En azından bildiğimden değil.)
Mathias Bynens

6
Ve mantıksal olarak git klonu - yinelemeli düşünmek bir alt modülün alt modüllerini de dolduracaktır, değil mi?
jayarjo


5
@toszter: çok akıllıca mı? Holding deposunun olmayan bir alt modül sürümüne ihtiyacı varsa ne olur master?
Gauthier

498

Bir alt modül doldurulmadan önce iki şey yapmanız gerekir:

git submodule init 
git submodule update

8
Bundan korkuyordum ... bu durumda kısmi bir projeye baktığın için hiçbir anlam ifade etmiyor. Alt modül güncellemelerinin otomatik olmadığını anlıyorum, ancak neden bağlı sürüm otomatik olarak teslim alınmıyor? Zorlamak için herhangi bir yol var mı? 3 seviyeli alt modülleri olan bir projem var ve sadece bir ödeme yapmak için bu kadar ilerlemek saçma görünüyor.
Mark

10
Lütfen kılavuzgit-submodule(1) sayfasını okuyun ( kernel.org/pub/software/scm/git/docs/git-submodule.html ). Bunun git submodule updategüzel bir parametreyi desteklediğini göreceksiniz --recursive.
joschi

95
Neden her ikisini de tek bir komutta yapmıyorsunuz? git submodule update --init(Ayrıca cevabımı da görün ).
Mathias Bynens

9
Soruyu bu iki komutla cevaplamanın daha iyi olduğunu düşünüyorum. Görevin nasıl yerine getirileceğini daha iyi açıklar.
schmijos

6
@MathiasBynens Henüz giriş yaptığım bir makinede git kısaltılmış talimatı desteklemeyen ancak iki komut olarak destekleyen git 1.5.5.6 var.
Jack Poulson

223

Git 2.23 (3Ç 2019): Alt modülleri klonlamak ve en son revizyonuna güncellemek istiyorsanız :

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

Sadece kayıtlı SHA1'lerinde klonlamak istiyorsanız:

git clone --recurse-submodules

Aşağıya bakınız.


Orijinal cevap 2010

Joschi'nin yorumlarda belirttiği gibi , git submoduleşimdi --recursiveseçeneği (Git1.6.5 ve daha fazlası) desteklemektedir.

Eğer --recursivebelirtilirse, bu komut kayıtlı submodules içine recurse ve içinde herhangi bir iç içe submodules güncelleyecektir.

Başlangıç ​​bölümü için Git alt modülleriyle özyinelemeli çalışma konusuna bakın .
Daha fazla bilgi için git submoduleaçıklamaya bakın .

Git 1.6 ve sonraki sürümlerde, süper projeyi aşağıdaki –-recursiveseçenekle klonlayarak otomatik olarak yapabilirsiniz :

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

2016'yı git 2.8 ile güncelleyin: " Git alt modüllerinin indirilmesi nasıl kullanılır / hızlandırılır git clone --recursive? " Konusuna bakın.

Paralel olarak birden çok iş parçacığı kullanarak alt modülü getirmeye başlayabilirsiniz.
Örneğin:

git fetch --recurse-submodules -j2

Daha da iyisi, Git 2.23 (Q3 2019) ile, alt modülü tek bir komutta izleme dallarına kopyalayabilir ve kontrol edebilirsiniz!

Bkz. Taahhüt, 4c69101 (19 Mayıs 2019), Ben Avison ( bavison) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 9.476.094 tamamlama 2019 17 Haz)

clone: --remote-submodulesbayrak ekle

Kullanırken , alt modüllerin süper projede kaydedilen SHA-1 yerine uzaktan izleme dallarında kontrol edilmesini istediğiniz herhangi bir kullanım durumu için örtük komuta git clone --recurse-submodulesgeçmenin bir yolu yoktu .--remotegit submodule update

Bu yama bu durumu düzeltir.
Aslında geçer --no-fetchiçin git submodule updatede onlar alt modülü sadece klonlanmış gerekçesiyle olarak, uzaktan yine sadece gelen getirilirken böylece aşağı yavaş şeyler görür.

Bunun anlamı:

--[no-]remote-submodules:

Klonlanan tüm alt modüller, süper projenin kayıtlı SHA-1'i yerine alt modülü güncellemek için alt modülün uzaktan izleme dalının durumunu kullanacaktır. Geçen eşdeğerdir --remoteiçin git submodule update.


3
Bu yüzden Git, alt modüller için uygun desteği eklemeye başlamak 14 yıl sürdü, ha. Güncelleme için teşekkürler! Zaten alt modüller olmadan ve kayıtlı bir SHA1 olmadan ana repo bir klon varsa ve her alt modülün son sürümünü çekmek istiyorum. Bu yapılabilir mi?
Violet Zürafa

1
@VioletGiraffe Klonlanan deponun alt modülleri varsa, "SHA1 kaydetti". Ve git submodule update --init --recursive --remotebunları ilgili şubelerinin en son taahhüdüne güncelleyin. (ör .: stackoverflow.com/a/56981834/6309 )
VonC

1
Bir örnekle açıklığa kavuşturayım: Github'da alt modülleri kullanan bir şablon projem var ve hatta alt modüllerin belirli revizyonlarını bu şablon deposuna aktardım. Ancak bu depodan yeni bir proje oluşturduğumda, listelediğiniz komutların hiçbiri (ne ne clone --recurse-submodules --remote-submodulesde submodule update --init --recursive --remote) alt depoları gerçekten getirmeme izin vermiyor. Tek aldığım bir .gitmodules dosyası ve bunları el ile tek tek klonlamaktan başka bir şey değil. En azından bunu yapmak için bir senaryo istiyorum submodule foreach...
Violet Giraffe

Bir çözüm biliyorsanız, cevaplayabileceğiniz ayrı bir soru soracağım. İşte el ile başka bir şey başlatmak için bulamıyorum test repo: github.com/VioletGiraffe/TEST
Violet Zürafa

@VioletGiraffe Bunun nedeni .gitmodules'ü eklemiş ve işlemiş olmanızdır, ancak gitlink'i değil ( stackoverflow.com/a/16581096/6309 , dizindeki özel girişler: stackoverflow.com/a/19354410/6309 ) İşte, uygun gitlink'in kayıtlı olmasını
VonC

108

[Hızlı cevap]

Repo'nuzu tüm alt modüllerle klonlamak için bu komutu kullanabilirsiniz:

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

Veya projeyi zaten klonladıysanız, şunları kullanabilirsiniz:

git submodule init
git submodule update

33

Alt modülünüz bir dalda eklenmişse, onu klon komutunuza eklediğinizden emin olun ...

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

Bu aradığım şey gibiydi ... ama alt modüller dallarını 'müstakil' olarak listeliyorlar. :(
AceFunk

28

Bunu dene:

git clone --recurse-submodules

Alt modülü ana projeye zaten eklediğinizi varsayarsak, alt modül verilerini otomatik olarak çeker.


37
Not --recurse-submodulesve --recursiveolan eşdeğer takma adlar .
Joel Purra

Bu durumda yapabileceğiniz @SuperUberDuper git submodule update --init --recursiveolarak açıklandığı bu cevap
Enrico

25

3 adımda gidebileceğinizi düşünüyorum:

git clone
git submodule init
git submodule update

21

geç cevap

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

Bir arkadaşımla tam bir saat uğraştığım için: BitBucket'te Yönetici haklarına sahip olsanız bile, her zaman ORİJİNAL deposunu klonlayın ve repoya sahip olanın şifresini kullanın. Bu minetrap ile karşılaştığınızı öğrenmek can sıkıcı: P


Ben de tam olarak bununla ilgileniyorum. Peki, alt modülleri olan bir bitbucket deposunda geliştirilmesi gereken herkesin, havuz oluşturucunun kimlik bilgilerini kullanması gerektiğini mi söylüyorsunuz? Blech.
jsleuth

@jsleuth Öyle görünüyor - BÜYÜK ZAMAN berbat ... ve biliyorum.
kaiser

Kulağa bir böcek gibi geliyor. Bitbucket'e rapor ettin mi?
Mathias Bynens

@MathiasBynens Bu sorunla karşılaştınız mı? Bir buçuk yıl sonra ve aslında durumun bu olup olmadığını bilmiyorum.
Kaiser

4
OP sorusuna açıklayıcı bir şekilde cevap vermez, ancak Bitbucket'teki ilgisiz bir hatayı ayrıntılandırır; bu arada, "SSH anahtar kimlik doğrulamasını kullan" kısaltılabilir.
Treffynnon

18

Git deposuna alt modülleri dahil etmek için bunu deneyin.

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

veya

git clone --recurse-submodules

18

--recursiveBir havuzu klonlarken bayrağı kullanabilirsiniz . Bu parametre git'i depodaki tüm tanımlanmış alt modülleri klonlamaya zorlar.

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

Klonlamadan sonra bazen alt modüller dallar değiştirilebilir, bu nedenle bu komutu ondan sonra çalıştırın:

git submodule foreach "git checkout master"

17

[Hızlı cevap]

Üst repoyu (bazı alt modül repolarını içeren) klonladıktan sonra, aşağıdakileri yapın:

git submodule update --init --recursive

11

Alt modüller paralel getirme, bir kerede birden çok havuzun getirilmesini sağlayarak bir havuzları ve ilgili tüm alt modülleri almak için gereken süreyi azaltmayı amaçlamaktadır. Bu, yeni --jobs seçeneği kullanılarak gerçekleştirilebilir, örneğin:

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

Git ekibine göre bu, birçok alt modül içeren depoların güncellenmesini önemli ölçüde hızlandırabilir. Yeni --jobs seçeneği olmadan --recurse-submodules kullanıldığında Git, alt modülleri tek tek getirecektir.

Kaynak: http://www.infoq.com/news/2016/03/git28-released


8

GitHub deposu için de aynı sorunu yaşadım. Hesabımda SSH Anahtarı eksik. Süreç

  1. SSH Anahtarı Oluştur
  2. GitHub hesabınıza yeni bir SSH anahtarı ekleme

Daha sonra havuzu alt modüllerle ( git clone --recursive YOUR-GIT-REPO-URL) klonlayabilirsiniz

veya

Zaten klonlanmış bir depoda alt modülleri çalıştırın git submodule initve git submodule updategetirin.


Evet, bu bir Permission denied (publickey). fatal: Could not read from remote repository.hatadır
Ender

5

Bunu dene.

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

Alt modülü bir dala eklediyseniz klon komutuna eklediğinizden emin olun.


5

Yeni bir proje ise bunu yapabilirsiniz:

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

Önceden yüklenmişse:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.