Baru di git1.8.4 mendatang (Juli 2013) :
" git submodule update
" secara opsional dapat mengkloning repositori submodul secara dangkal.
(Dan git 2.10 Q3 2016 memungkinkan untuk merekamnya dengan git config -f .gitmodules submodule.<name>.shallow true
.
Lihat akhir dari jawaban ini)
Lihat commit 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Tambahkan --depth
opsi ke perintah tambah dan perbarui "git submodule", yang kemudian diteruskan ke perintah klon. Ini berguna ketika submodul berukuran besar dan Anda tidak terlalu tertarik pada apa pun kecuali commit terbaru.
Pengujian ditambahkan dan beberapa penyesuaian indensi dilakukan untuk menyesuaikan dengan sisa testfile pada "pembaruan submodule dapat menangani tautan simbolik dalam pwd".
Ditandatangani oleh: Fredrik Gustafsson <iveqy@iveqy.com>
Diakui oleh: Jens Lehmann<Jens.Lehmann@web.de>
Artinya, ini berfungsi:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Dengan:
--depth::
Opsi ini berlaku untuk perintah add
dan update
.
Buat klon 'dangkal' dengan riwayat terpotong ke jumlah revisi yang ditentukan.
atwyman menambahkan di komentar :
Sejauh yang saya tahu opsi ini tidak dapat digunakan untuk submodul yang tidak melacak dengan master
sangat dekat. Jika Anda menyetel kedalaman 1, maka submodule update
hanya bisa berhasil jika komit submodul yang Anda inginkan adalah master terbaru. Jika tidak, Anda mendapatkan " fatal: reference is not a tree
" .
Itu benar.
Artinya, hingga git 2.8 (Maret 2016). Dengan 2.8, submodule update --depth
memiliki satu kesempatan lagi untuk berhasil, bahkan jika SHA1 dapat langsung dijangkau dari salah satu HEAD repo jarak jauh.
Lihat commit fb43e31 (24 Feb 2016) oleh Stefan Beller ( stefanbeller
) .
Dibantu oleh: Junio C Hamano ( gitster
) .
(Digabung oleh Junio C Hamano - gitster
- di commit 9671a76 , 26 Feb 2016)
submodule: berusaha lebih keras untuk mengambil sha1 yang dibutuhkan dengan mengambil langsung sha1
Saat meninjau perubahan yang juga memperbarui submodul di Gerrit, praktik tinjauan yang umum adalah mengunduh dan memilih patch secara lokal untuk mengujinya.
Namun saat mengujinya secara lokal, ' git submodule update
' mungkin gagal mengambil submodul yang benar sha1 karena komit yang sesuai di submodul belum menjadi bagian dari riwayat proyek, tetapi juga hanya perubahan yang diusulkan.
Jika $sha1
bukan bagian dari pengambilan default, kami mencoba mengambil $sha1
secara langsung . Namun beberapa server tidak mendukung pengambilan langsung oleh sha1, yang menyebabkan git-fetch
kegagalan dengan cepat.
Kita bisa gagal sendiri di sini karena sha1 yang masih hilang akan menyebabkan kegagalan nanti di tahap checkout, jadi gagal di sini sebaik yang kita bisa dapatkan.
MVG menunjukkan di komentar untuk melakukan fb43e31 (git 2.9, Feb 2016)
Tampaknya bagi saya bahwa komit fb43e31 meminta komit yang hilang oleh id SHA1, jadi pengaturan uploadpack.allowReachableSHA1InWant
dan uploadpack.allowTipSHA1InWant
pada server mungkin akan memengaruhi apakah ini berfungsi.
Saya menulis posting ke daftar git hari ini , menunjukkan bagaimana penggunaan submodul dangkal dapat dibuat agar bekerja lebih baik untuk beberapa skenario, yaitu jika komit juga merupakan tag.
Kita lihat saja.
Saya rasa ini adalah alasan mengapa fb43e31 membuat pengambilan untuk SHA1 tertentu sebagai fallback setelah pengambilan untuk cabang default.
Namun demikian, dalam kasus "--depth 1" saya pikir akan masuk akal untuk membatalkan lebih awal: jika tidak ada referensi yang terdaftar sesuai dengan yang diminta, dan meminta oleh SHA1 tidak didukung oleh server, maka tidak ada gunanya mengambil apa pun, karena kami juga tidak dapat memenuhi persyaratan submodule.
Perbarui Agustus 2016 (3 tahun kemudian)
Dengan Git 2.10 (Q3 2016), Anda dapat melakukannya
git config -f .gitmodules submodule.<name>.shallow true
Lihat " Submodul Git tanpa bobot ekstra " untuk informasi selengkapnya.
Git 2.13 (Q2 2017) lakukan add in commit 8d3047c (19 Apr 2017) oleh Sebastian Schuberth ( sschuberth
) .
(Digabung oleh Sebastian Schuberth - sschuberth
- di commit 8d3047c , 20 Apr 2017)
klon dari submodul ini akan dilakukan sebagai klon dangkal (dengan kedalaman riwayat 1)
Namun, Ciro Santilli menambahkan di komentar (dan rincian jawabannya )
shallow = true
pada .gitmodules
hanya mempengaruhi referensi dilacak oleh KEPALA remote saat menggunakan --recurse-submodules
, bahkan jika target komit ditunjukkan oleh cabang, dan bahkan jika Anda menempatkan branch = mybranch
pada .gitmodules
juga.
Git 2.20 (Q4 2018) meningkatkan dukungan submodule, yang telah diperbarui untuk dibaca dari blob pada HEAD:.gitmodules
saat.gitmodules
file hilang dari pohon kerja.
Lihat commit 2b1257e , commit 76e9bdc (25 Okt 2018), dan commit b5c259f , commit 23dd8f5 , commit b2faad4 , commit 2502ffc , commit 996df4d , commit d1b13df , commit 45f5ef3 , commit bcbc780 (05 Oct 2018) oleh Antonio Ospite ( ao2
) .
(Digabung oleh Junio C Hamano - gitster
- di commit abb4824 , 13 Nov 2018)
submodule
: mendukung membaca .gitmodules
saat tidak ada di pohon kerja
Ketika .gitmodules
file tidak tersedia di pohon kerja, coba gunakan konten dari indeks dan dari cabang saat ini.
Ini mencakup kasus ketika file adalah bagian dari repositori tetapi karena alasan tertentu tidak diperiksa, misalnya karena pembayaran yang jarang.
Ini memungkinkan untuk menggunakan setidaknya perintah ' git submodule
' yang membaca filegitmodules
file konfigurasi tanpa sepenuhnya mengisi pohon bekerja.
Menulis ke .gitmodules
akan tetap mengharuskan file tersebut diperiksa, jadi periksalah sebelum meneleponconfig_set_in_gitmodules_file_gently
.
Tambahkan juga pemeriksaan serupa git-submodule.sh::cmd_add()
untuk mengantisipasi kegagalan akhir dari perintah " git submodule add
" saat .gitmodules
tidak dapat ditulisi dengan aman; ini mencegah perintah meninggalkan repositori dalam keadaan palsu (misalnya, repositori submodul telah digandakan tetapi .gitmodules
tidak diperbarui karenaconfig_set_in_gitmodules_file_gently
gagal).
Selain itu, karena config_from_gitmodules()
sekarang mengakses penyimpanan objek global, semua jalur kode yang memanggil fungsi harus dilindungi dari akses bersamaan ke penyimpanan objek global.
Saat ini ini hanya terjadi di builtin/grep.c::grep_submodules()
, jadi panggil
grep_read_lock()
sebelum memanggil kode yang melibatkanconfig_from_gitmodules()
.
CATATAN: ada satu kasus yang jarang terjadi di mana fitur baru ini belum berfungsi dengan baik: submodul bersarang tanpa .gitmodules
pohon kerja mereka.
Catatan: Git 2.24 (Q4 2019) memperbaiki kemungkinan segfault saat mengkloning submodul dangkal.
Lihat commit ddb3c85 (30 Sep 2019) oleh Ali Utku Selen ( auselen
) .
(Digabung oleh Junio C Hamano - gitster
- di commit 678a9ca , 09 Okt 2019)
Git 2.25 (Q1 2020), memperjelas git submodule update
dokumentasi.
Lihat commit f0e58b3 (24 Nov 2019) oleh Philippe Blain ( phil-blain
) .
(Digabung oleh Junio C Hamano - gitster
- di commit ef61045 , 05 Des 2019)
doc
: sebutkan bahwa 'git submodule update' mengambil komit yang hilang
Dibantu oleh: Junio C Hamano
Dibantu: Johannes Schindelin
Ditandatangani oleh: Philippe Blain
' git submodule
update' akan mengambil komit baru dari remote submodule jika SHA-1 yang direkam di superproject tidak ditemukan . Ini tidak disebutkan dalam dokumentasi.
Peringatan: Dengan Git 2.25 (K1 2020), interaksi antara " git clone --recurse-submodules
" dan penyimpanan objek alternatif tidak dirancang dengan baik.
Dokumentasi dan kode telah diajarkan untuk membuat rekomendasi yang lebih jelas ketika pengguna melihat kegagalan.
Lihat commit 4f3e57e , commit 10c64a0 (02 Des 2019) oleh Jonathan Tan ( jhowtan
) .
(Digabung oleh Junio C Hamano -gitster
- di commit 5dd1d59 , 10 Des 2019)
submodule--helper
: saran tentang kesalahan alternatif yang fatal
Ditandatangani oleh: Jonathan Tan
Diakui oleh: Jeff King
Saat mengkloning superproject secara rekursif dengan beberapa modul dangkal yang ditentukan di dalamnya .gitmodules
, kemudian melakukan kloning ulang dengan " --reference=<path>
", kesalahan terjadi. Sebagai contoh:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
gagal dengan:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Ketika alternatif yang dihitung dari alternatif superproject tidak dapat ditambahkan, baik dalam kasus ini atau lainnya, saran tentang mengkonfigurasi " submodule.alternateErrorStrategy
" opsi konfigurasi dan menggunakan "--reference-if-able
" daripada " --reference
" saat kloning.
Itu dirinci dalam:
Dengan Git 2.25 (Q1 2020), interaksi antara "git clone --recurse-submodules" dan penyimpanan objek alternatif tidak dirancang dengan baik.
Doc
: jelaskan submodule.alternateErrorStrategy
Ditandatangani oleh: Jonathan Tan
Diakui oleh: Jeff King
Commit 31224cbdc7 (" clone
: opsi rekursif dan referensi memicu alternatif submodule", 17-08-2016, Git v2.11.0-rc0 - merge yang terdaftar di batch # 1 ) mengajari Git untuk mendukung opsi konfigurasi " submodule.alternateLocation
" dan "submodule.alternateErrorStrategy
" pada superproject .
Jika " submodule.alternateLocation
" dikonfigurasi ke "superproject
" di superproject, setiap kali submodul dari superproject itu dikloning, ia akan menghitung jalur alternatif analog untuk submodul tersebut dari$GIT_DIR/objects/info/alternates
superproject, dan mereferensikannya.
Opsi " submodule.alternateErrorStrategy
" menentukan apa yang terjadi jika alternatif itu tidak dapat dirujuk.
Namun, tidak jelas bahwa hasil klon seolah-olah tidak ada alternatif yang ditentukan saat opsi tersebut tidak disetel ke "mati" (seperti yang dapat dilihat dalam pengujian di 31224cbdc7 ).
Oleh karena itu, dokumentasikan dengan benar.
The dokumentasi config submodule sekarang termasuk:
submodule.alternateErrorStrategy::
Menentukan cara menangani kesalahan dengan alternatif untuk submodule seperti yang dihitung melalui submodule.alternateLocation
.
Nilai yang mungkin adalah ignore
, info
, die
.
Default-nya adalah die
.
Perhatikan bahwa jika disetel ke ignore
atau info
, dan jika ada kesalahan dengan alternatif yang dihitung, proses penggandaan seolah-olah tidak ada alternatif yang ditentukan .
git submodule add/update
" sekarang dapat mengkloning repositori submodul secara dangkal! Lihat jawaban saya di bawah