Apakah mungkin memiliki submodul yang dangkal? Saya memiliki superproject dengan beberapa submodul, masing-masing dengan sejarah yang panjang, jadi tidak perlu terlalu besar menyeret semua sejarah itu.
Yang saya temukan hanyalah utas yang belum terjawab ini .
Haruskah saya meretas git-submodule untuk menerapkan ini?
git
git-submodules
Mauricio Scheffer
sumber
sumber
git submodule add/update
" sekarang dapat mengkloning repositori submodul secara dangkal! Lihat jawaban saya di bawahJawaban:
Baru di git1.8.4 mendatang (Juli 2013) :
(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 :
Artinya, ini berfungsi:
Dengan:
atwyman menambahkan di komentar :
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)MVG menunjukkan di komentar untuk melakukan fb43e31 (git 2.9, Feb 2016)
Perbarui Agustus 2016 (3 tahun kemudian)
Dengan Git 2.10 (Q3 2016), Anda dapat melakukannya
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)Namun, Ciro Santilli menambahkan di komentar (dan rincian jawabannya )
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)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)Peringatan: Dengan Git 2.25 (K1 2020), interaksi antara "
git clone --recurse-submodules
" dan penyimpanan objek alternatif tidak dirancang dengan baik.Lihat commit 4f3e57e , commit 10c64a0 (02 Des 2019) oleh Jonathan Tan (
jhowtan
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 5dd1d59 , 10 Des 2019)Itu dirinci dalam:
Dengan Git 2.25 (Q1 2020), interaksi antara "git clone --recurse-submodules" dan penyimpanan objek alternatif tidak dirancang dengan baik.
The dokumentasi config submodule sekarang termasuk:
sumber
--depth
haruskah bertengkar juga;)uploadpack.allowReachableSHA1InWant
danuploadpack.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..gitmodules
, apakah--depth 1
opsi tersebut berfungsi untuk cabang yang tidak melacak master dengan cermat?Git 2.9.0 mendukung submodul shallow clone secara langsung, jadi sekarang Anda dapat memanggil:
sumber
Mengikuti jawaban Ryan, saya dapat menghasilkan skrip sederhana ini yang mengulangi semua submodul dan mengkloningnya:
sumber
fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349df
untuk setiap submodulMembaca "source" git-submodule, sepertinya
git submodule add
dapat menangani submodul yang sudah memiliki repositori. Dalam hal itu...Anda akan ingin memastikan komit yang diperlukan ada di repo submodule, jadi pastikan Anda menyetel --depth yang sesuai.
Sunting: Anda mungkin bisa lolos dengan beberapa klon submodul manual diikuti dengan satu pembaruan:
sumber
Ringkasan perilaku buggy / tidak terduga / mengganggu pada Git 2.14.1
shallow = true
di.gitmodules
hanya mempengaruhigit clone --recurse-submodules
jikaHEAD
poin submodule remote untuk yang diperlukan komit, bahkan jika target komit ditunjukkan oleh cabang, dan bahkan jika Anda menempatkanbranch = mybranch
pada.gitmodules
juga.Skrip pengujian lokal . Perilaku yang sama di GitHub 2017-11,
HEAD
yang dikontrol oleh setelan repo cabang default:git clone --recurse-submodules --shallow-submodules
gagal jika komit yang tidak direferensikan oleh cabang atau tag dengan pesan:error: Server does not allow request for unadvertised object
.Skrip pengujian lokal . Perilaku yang sama di GitHub:
Saya juga bertanya di milis: https://marc.info/?l=git&m=151863590026582&w=2 dan jawabannya adalah:
Tes TODO:
allowReachableSHA1InWant
.sumber
git clone --recursive
yang hanya mengambil komit khusus tersebut.Apakah lokasi kanonik untuk submodul Anda jauh? Jika ya, apakah Anda setuju dengan kloningnya satu kali? Dengan kata lain, apakah Anda menginginkan klon dangkal hanya karena Anda menderita bandwidth yang terbuang dari klon (ulang) submodul yang sering?
Jika Anda ingin klon dangkal untuk menghemat ruang disk lokal, maka jawaban Ryan Graham sepertinya cara yang bagus. Kloning repositori secara manual agar dangkal. Jika menurut Anda itu akan berguna, sesuaikan
git submodule
untuk mendukungnya. Kirim email ke daftar menanyakannya (saran untuk menerapkannya, saran tentang antarmuka, dll.). Menurut pendapat saya, orang-orang di sana cukup mendukung kontributor potensial yang dengan sungguh-sungguh ingin meningkatkan Git dengan cara yang konstruktif.Jika Anda tidak keberatan melakukan satu klon penuh dari setiap submodul (ditambah pengambilan nanti untuk menjaganya tetap mutakhir), Anda dapat mencoba menggunakan
--reference
opsigit submodule update
(ada di Git 1.6.4 dan yang lebih baru) untuk merujuk ke penyimpanan objek lokal (mis. buat--mirror
klon dari repositori submodul kanonik, lalu gunakan--reference
di submodul Anda untuk menunjuk ke klon lokal ini). Pastikan untuk membaca tentanggit clone --reference
/git clone --shared
sebelum menggunakan--reference
. Satu-satunya masalah yang mungkin terjadi dengan mirror referensi adalah jika mereka akhirnya mengambil pembaruan non-fast-forward (meskipun Anda dapat mengaktifkan reflog dan memperluas jendela kedaluwarsa untuk membantu mempertahankan komitmen yang ditinggalkan yang mungkin menyebabkan masalah). Anda seharusnya tidak memiliki masalah selamaJika Anda menggunakan sesuatu seperti ini dan ada kemungkinan Anda membawa komit submodul lokal di pohon kerja Anda, mungkin ide yang bagus untuk membuat sistem otomatis yang memastikan objek penting yang direferensikan oleh submodul yang diperiksa tidak dibiarkan tergantung di repositori mirror (dan jika ada yang ditemukan, salin ke repositori yang membutuhkannya).
Dan, seperti yang
git clone
dikatakan halaman manual, jangan gunakan--reference
jika Anda tidak memahami implikasi ini.Alternatifnya, alih-alih
--reference
, Anda dapat menggunakan klon cermin yang dikombinasikan dengan fungsionalitas tautan keras defaultgit clone
dengan menggunakan cermin lokal sebagai sumber untuk submodul Anda. Dalam klon super-proyek baru, lakukangit submodule init
, edit URL submodule di . Anda perlu menyalin kembali semua submodul yang telah diperiksa untuk mendapatkan tautan keras. Anda akan menghemat bandwidth dengan hanya mengunduh sekali ke dalam mirror, kemudian mengambil secara lokal dari itu ke dalam submodul yang Anda check-out. Tautan keras akan menghemat ruang disk (meskipun pengambilan cenderung terakumulasi dan diduplikasi di beberapa contoh penyimpanan objek submodul yang diperiksa; Anda dapat secara berkala membuat ulang submodul yang diperiksa dari cermin untuk mendapatkan kembali penghematan ruang disk yang disediakan oleh hardlinking)..git/config
untuk mengarah ke mirror lokal, lalu lakukangit submodule update
sumber
Saya membuat versi yang sedikit berbeda, karena saat itu tidak berjalan di tepi berdarah, yang tidak semua proyek melakukannya. Penambahan submodul standar tidak berfungsi, begitu pula skrip di atas. Jadi saya menambahkan pencarian hash untuk tag ref, dan jika tidak memilikinya, itu kembali ke klon penuh.
sumber
Referensi ke Bagaimana cara mengkloning repositori git dengan revisi / perubahan tertentu?
Saya telah menulis skrip sederhana yang tidak memiliki masalah ketika referensi submodul Anda jauh dari master
Pernyataan ini akan mengambil versi submodul yang direferensikan.
Ini cepat tetapi Anda tidak dapat melakukan suntingan Anda pada submodule (Anda harus mengambil unshallow sebelum https://stackoverflow.com/a/17937889/3156509 )
sepenuhnya:
sumber
Klon dangkal dari submodul sempurna karena mereka mengambil snapshot pada revisi / set perubahan tertentu. Sangat mudah untuk mengunduh zip dari situs web jadi saya mencoba untuk membuat skrip.
git submodule deinit --all -f
membersihkan pohon submodul yang memungkinkan skrip dapat digunakan kembali.git submodule
mengambil 40 karakter sha1 diikuti dengan jalur yang sesuai dengan di.gitmodules
. Saya menggunakan perl untuk menggabungkan informasi ini, dibatasi oleh titik dua, kemudian menggunakan transformasi variabel untuk memisahkan nilai menjadimysha
danmysub
.Ini adalah kunci penting karena kita memerlukan sha1 untuk diunduh dan jalur untuk menghubungkan
url
in .gitmodules.Diberikan entri submodul khas:
myurl
tombol padapath =
kemudian mencari 2 baris setelah untuk mendapatkan nilainya. Metode ini mungkin tidak bekerja secara konsisten dan membutuhkan perbaikan. Url grep menghapus semua.git
referensi jenis yang tersisa dengan mencocokkan yang terakhir/
dan apa pun hingga a.
.mydir
adalahmysub
minus final/name
yang akan dilakukan oleh direktori yang mengarah ke nama submodule.Berikutnya adalah
wget
dengan format url arsip zip yang dapat diunduh. Ini mungkin berubah di masa depan.Buka zip file
mydir
yang akan menjadi subdirektori yang ditentukan di jalur submodul. Folder yang dihasilkan akan menjadi elemen terakhir dariurl
-sha1
.Periksa untuk melihat apakah subdirektori yang ditentukan di jalur submodul ada dan hapus untuk memungkinkan penggantian nama folder yang diekstrak.
mv
ganti nama folder yang diekstrak yang berisi sha1 kami ke jalur submodul yang benar.Hapus file zip yang diunduh.
Submodul init
Ini lebih merupakan bukti konsep WIP daripada solusi. Saat berhasil, hasilnya adalah klon dangkal dari submodule pada set perubahan tertentu.
Jika repositori mengembalikan submodul ke komit yang berbeda, jalankan ulang skrip untuk memperbarui.
Satu-satunya saat skrip seperti ini akan berguna adalah untuk bangunan lokal non-kolaboratif dari proyek sumber.
sumber
Saya membutuhkan solusi untuk kloning submodul yang dangkal ketika saya tidak dapat mempengaruhi kloning repo utama. Berdasarkan satu solusi di atas:
sumber