Bagaimana cara "git klon" termasuk submodul?


1995

Saya mencoba memasukkan submodule ke dalam repo. Masalahnya adalah ketika saya mengkloning induk repo, folder submodule sepenuhnya kosong.

Apakah ada cara untuk membuatnya sehingga git clone parent_repobenar - benar menempatkan data di folder submodule?

Misalnya, http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativemenunjuk pada git submodule eksternal, tetapi ketika saya checkout sequelizeproyek, folder yang kosong.


4
Perintah itu adalah git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23): itu akan mengkloning dan memperbarui submodul dalam satu perintah. Lihat jawaban saya yang diedit di bawah .
VonC

Jawaban:


2976

Dengan versi 2.13 dari Git dan yang lebih baru, --recurse-submodulesdapat digunakan sebagai ganti --recursive:

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

Catatan Editor: -j8adalah pengoptimalan kinerja opsional yang tersedia di versi 2.8, dan mengambil hingga 8 submodul sekaligus secara paralel - lihat man git-clone.

Dengan versi 1.9 dari Git hingga versi 2.12 ( -jflag hanya tersedia di versi 2.8+):

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

Dengan Git versi 1.6.5 dan yang lebih baru, Anda dapat menggunakan:

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

Untuk repo yang sudah dikloning, atau versi Git yang lebih lama, gunakan:

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

123
Apakah ada cara untuk menentukan perilaku ini sebagai default di repositori git Anda, sehingga klon yang kurang informasi akan secara otomatis mendapatkan submodule yang diinisialisasi?
NHDaly

11
@NHDaly Sedihnya, tidak. (Setidaknya saya tidak tahu.)
Mathias Bynens

6
Dan secara logis berpikir git klon - rekursif juga akan mengisi setiap submodule dari submodule, kan?
jayarjo


5
@toszter: apakah ini bijaksana? Bagaimana jika repo holding memerlukan versi submodule yang bukan master ?
Gauthier

498

Anda harus melakukan dua hal sebelum submodule diisi:

git submodule init 
git submodule update

8
Saya takut itu ... tidak masuk akal karena Anda memeriksa proyek parsial dalam kasus itu. Saya mengerti bahwa pembaruan submodule tidak otomatis, tetapi mengapa versi terikat tidak diperiksa secara otomatis ?? Apakah ada cara untuk memaksanya? Saya punya proyek dengan 3-tingkat submodules dan tampaknya tidak masuk akal untuk melewati sejauh itu hanya untuk melakukan checkout.
Markus

11
Silakan baca git-submodule(1)halaman manual ( kernel.org/pub/software/scm/git/docs/git-submodule.html ). Anda akan mengetahui bahwa git submodule updatemendukung parameter bagus bernama --recursive.
joschi

95
Mengapa tidak melakukan keduanya dalam satu perintah? git submodule update --init(Lihat juga jawaban saya ).
Mathias Bynens

9
Saya pikir lebih baik menjawab pertanyaan dengan dua perintah ini. Ini menjelaskan lebih baik bagaimana menyelesaikan tugas.
schmijos

6
@MathiasBynens Mesin yang baru saja saya masuki hanya memiliki git 1.5.5.6, yang tampaknya tidak mendukung instruksi singkat, tetapi mendukungnya sebagai dua perintah.
Jack Poulson

224

Git 2.23 (Q3 2019): jika Anda ingin mengkloning dan memperbarui submodules ke revisi terbaru mereka:

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

Jika Anda hanya ingin mengkloning mereka di SHA1 yang direkam:

git clone --recurse-submodules

Lihat di bawah.


Jawaban asli 2010

Seperti joschi menyebutkan dalam komentar, git submodulesekarang mendukung --recursiveopsi (Git1.6.5 dan lebih banyak).

Jika --recursiveditentukan, perintah ini akan muncul kembali ke submodula terdaftar, dan memperbarui submodula bersarang di dalamnya.

Lihat Bekerja dengan git submodul secara rekursif untuk bagian init.
Lihat git submoduledijelaskan lebih lanjut.

Dengan versi 1.6.5 dari git dan yang lebih baru, Anda dapat melakukan ini secara otomatis dengan mengkloning super-proyek dengan –-recursiveopsi:

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

Perbarui 2016, dengan git 2.8: lihat " Bagaimana cara mempercepat / memparalelkan unduhan dari submodules git menggunakan git clone --recursive? "

Anda dapat memulai mengambil submodule menggunakan beberapa utas, secara paralel.
Untuk instansi:

git fetch --recurse-submodules -j2

Bahkan lebih baik, dengan Git 2.23 (Q3 2019), Anda dapat mengkloning dan checkout submodule ke cabang pelacakan mereka dalam satu perintah!

Lihat komit 4c69101 (19 Mei 2019) oleh Ben Avison ( bavison) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 9476094 , 17 Jun 2019)

clone: tambahkan --remote-submodulesbendera

Saat menggunakan git clone --recurse-submodulessebelumnya tidak ada cara untuk --remoteberalih ke git submodule updateperintah implisit untuk setiap kasus penggunaan di mana Anda ingin submodula diperiksa di cabang pelacakan jarak jauh daripada dengan SHA-1 yang direkam dalam proyek super.

Patch ini memperbaiki situasi ini.
Ini sebenarnya melewati --no-fetchke git submodule updateserta dengan alasan mereka submodule yang baru saja dikloning, sehingga mengambil dari remote lagi hanya berfungsi untuk memperlambat segalanya.

Itu berarti:

--[no-]remote-submodules:

Semua submodule yang dikloning akan menggunakan status cabang pelacak jarak jauh submodule untuk memperbarui submodule, daripada SHA-1 superproyek yang direkam. Setara dengan meneruskan --remoteke git submodule update.


3
Jadi butuh Git 14 tahun untuk mulai menambahkan dukungan yang tepat untuk submodula, ya. Terima kasih atas pembaruannya! Bagaimana jika saya sudah memiliki klon dari repo utama tanpa submodules dan tanpa SHA1 yang direkam, dan saya ingin menarik versi terbaru dari setiap submodule. Apakah bisa dilakukan?
Violet Giraffe

1
@VioletGiraffe Jika repositori yang dikloning itu memiliki submodules, itu telah "mencatat SHA1". Dan git submodule update --init --recursive --remoteharus memperbarui mereka ke komit terbaru dari cabang masing-masing. (mis: stackoverflow.com/a/56981834/6309 )
VonC

1
Izinkan saya mengklarifikasi dengan sebuah contoh: Saya memiliki proyek templat di Github yang menggunakan submodul, dan saya bahkan melakukan revisi spesifik dari submodul ke dalam repo templat ini. Tetapi ketika saya membuat proyek baru dari repo ini, tidak ada perintah yang Anda daftarkan (tidak clone --recurse-submodules --remote-submodulesjuga submodule update --init --recursive --remote) yang benar-benar membuat saya mengambil subrepo. Yang saya dapatkan hanyalah file .gitmodules, dan saya tidak bisa menemukan cara untuk memulai subrepo selain dari kloning secara manual satu per satu. Saya ingin setidaknya memiliki naskah untuk melakukannya dengan submodule foreach...
Violet Giraffe

Jika Anda tahu solusinya, saya akan mengajukan pertanyaan terpisah yang bisa Anda jawab. Inilah repo tes yang tidak dapat saya temukan selain dengan tangan: github.com/VioletGiraffe/TEST
Violet Giraffe

@VioletGiraffe Itu karena Anda telah menambahkan dan melakukan .gitmodules tetapi bukan gitlink ( stackoverflow.com/a/16581096/6309 , entri khusus dalam indeks: stackoverflow.com/a/19354410/6309 ) Berikut adalah repositori yang tidak daftarkan gitlink yang tepat: github.com/tiagomazzutti/antlr4dart
VonC

109

[Jawaban cepat]

Anda dapat menggunakan perintah ini untuk mengkloning repo Anda dengan semua submodul:

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

Atau jika Anda sudah mengkloning proyek, Anda dapat menggunakan:

git submodule init
git submodule update

33

Jika submodule Anda ditambahkan dalam cabang pastikan untuk memasukkannya dalam perintah klon Anda ...

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

Ini lebih seperti apa yang saya cari ... tetapi submodules mendaftar cabang mereka sebagai 'terlepas'. :(
AceFunk

28

Coba ini:

git clone --recurse-submodules

Secara otomatis menarik data submodule dengan anggapan Anda telah menambahkan submodules ke proyek induk.


37
Perhatikan bahwa --recurse-submodulesdan --recursiveadalah alias setara .
Joel Purra

@SuperUberDuper dalam hal ini Anda dapat melakukan git submodule update --init --recursiveseperti yang dijelaskan dalam jawaban ini
Enrico

25

Saya pikir Anda bisa pergi dengan 3 langkah:

git clone
git submodule init
git submodule update

21

jawaban terlambat

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

Karena saya hanya menghabiskan satu jam bermain-main dengan seorang teman: Bahkan jika Anda memiliki hak Admin di BitBucket, selalu tiru repositori ASLI dan gunakan kata sandi orang yang memiliki repo itu. Mengganggu mengetahui bahwa Anda berlari ke dalam minetrap ini: P


Itulah tepatnya yang sedang saya hadapi. Jadi, apakah Anda mengatakan bahwa siapa pun yang perlu mengembangkan pada repositori bitbucket yang memiliki submodul harus menggunakan kredensial pembuat repositori? Blech.
jsleuth

@juthuth Sepertinya - menyebalkan WAKTU BESAR ... dan saya tahu itu.
kaiser

Itu terdengar seperti bug. Apakah Anda melaporkannya ke Bitbucket?
Mathias Bynens

@MathiasBynens Apakah Anda menemukan masalah ini? Satu setengah tahun kemudian dan saya benar-benar tidak tahu apakah ini masih terjadi.
kaiser

4
Itu tidak secara deskriptif menjawab pertanyaan OPs, tetapi merinci bug yang tidak terkait di Bitbucket; yang, kebetulan, bisa saja disingkat menjadi "menggunakan otentikasi kunci SSH".
Treffynnon

18

Coba ini untuk memasukkan submodules dalam repositori git.

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

atau

git clone --recurse-submodules

18

Anda dapat menggunakan --recursivebendera saat mengkloning repositori. Parameter ini memaksa git untuk mengkloning semua submodul yang ditentukan dalam repositori.

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

Setelah kloning, kadang-kadang cabang submodula dapat diubah, jadi jalankan perintah ini setelahnya:

git submodule foreach "git checkout master"

17

[Jawaban cepat]

Setelah mengkloning induk repo (yang berisi beberapa submo submodule), lakukan hal berikut:

git submodule update --init --recursive

11

Submodules parallel fetch bertujuan untuk mengurangi waktu yang diperlukan untuk mengambil repositori dan semua submodulanya yang terkait dengan memungkinkan pengambilan beberapa repositori sekaligus. Ini dapat dicapai dengan menggunakan opsi --jobs baru, misalnya:

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

Menurut tim Git, ini secara substansial dapat mempercepat memperbarui repositori yang berisi banyak submodul. Saat menggunakan --recurse-submodules tanpa opsi --jobs baru, Git akan mengambil submodules satu per satu.

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


8

Saya memiliki masalah yang sama untuk repositori GitHub. Akun saya hilang Kunci SSH. Prosesnya adalah

  1. Hasilkan Kunci SSH
  2. Menambahkan kunci SSH baru ke akun GitHub Anda

Kemudian, Anda dapat mengkloning repositori dengan submodules ( git clone --recursive YOUR-GIT-REPO-URL)

atau

Jalankan git submodule initdan git submodule updateambil submodula di repositori yang sudah dikloning.


Ya, itu Permission denied (publickey). fatal: Could not read from remote repository.salah
Ender

5

Coba ini.

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

Jika Anda telah menambahkan submodule di cabang pastikan Anda menambahkannya ke perintah clone.


5

Jika ini adalah proyek baru, Anda dapat melakukannya seperti ini:

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

Jika sudah diinstal daripada:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.