Kami menggunakan git submodules untuk mengelola beberapa proyek besar yang memiliki ketergantungan pada banyak perpustakaan lain yang telah kami kembangkan. Setiap perpustakaan adalah repo terpisah yang dibawa ke proyek dependen sebagai submodule. Selama pengembangan, kita sering ingin mengambil versi terbaru dari setiap submodule yang bergantung.
Apakah git memiliki perintah bawaan untuk melakukan ini? Jika tidak, bagaimana dengan file batch Windows atau sejenisnya yang dapat melakukannya?
git
git-submodules
Brad Robinson
sumber
sumber
Jawaban:
Jika ini adalah pertama kalinya Anda check-out repo, Anda perlu menggunakan
--init
dulu:Untuk git 1.8.2 atau lebih tinggi, opsi
--remote
telah ditambahkan untuk mendukung pembaruan ke tips terbaru dari cabang jarak jauh:Ini memiliki manfaat tambahan untuk menghormati cabang "non default" yang ditentukan dalam file
.gitmodules
atau.git/config
(jika Anda kebetulan punya, default adalah asal / master, dalam hal ini beberapa jawaban lain di sini akan bekerja juga).Untuk git 1.7.3 atau lebih baru, Anda dapat menggunakan (tetapi gotchas di bawah tentang pembaruan apa yang masih berlaku):
atau:
jika Anda ingin menarik submodul Anda ke commit terbaru alih-alih komit saat ini, arahkan ke.
Lihat git-submodule (1) untuk detailnya
sumber
git submodule update --recursive
saat ini.git submodule foreach "(git checkout master; git pull)&"
origin master
di akhir perintah ini mungkin memiliki hasil yang tidak terduga jika beberapa submodula Anda melacak cabang atau nama lokasi yang berbeda dari submodule tertentu. Jelas bagi sebagian orang, tetapi mungkin tidak bagi semua orang.git submodule update --recursive
terlihat untuk melihat revisi mana repositori induk telah disimpan untuk setiap submodule, kemudian memeriksa revisi itu di setiap submodule. Ini TIDAK menarik komit terbaru untuk setiap submodule.git submodule foreach git pull origin master
ataugit pull origin master --recurse-submodules
apa yang Anda inginkan jika Anda ingin memperbarui setiap submodule ke yang terbaru dari repositori asalnya. Hanya dengan demikian Anda akan mendapatkan perubahan yang tertunda dalam repo induk dengan hash revisi yang diperbarui untuk submodul. Periksa itu dan Anda baik-baik saja.Sampai bug diperbaiki, untuk pertama kali Anda perlu menjalankannya
sumber
git pull --recurse-submodules
ataugit submodule update --recursive
tidak tidak initialize baru submodul menambahkan. Untuk menginisialisasi mereka, Anda perlu menjalankangit submodule update --recursive --init
. Kutipan dari manual : Jika submodule belum diinisialisasi, dan Anda hanya ingin menggunakan pengaturan seperti yang tersimpan di .gitmodules, Anda dapat secara otomatis menginisialisasi submodule dengan opsi --init.git submodule update --recursive --remote
yang juga memperbarui submodules ke revisi terbaru jarak jauh alih-alih SHA-1 yang disimpan.Pada init menjalankan perintah berikut:
dari dalam direktori git repo, yang terbaik untuk saya.
Ini akan menarik semua submodula terbaru termasuk.
Dijelaskan
Setelah ini, Anda bisa menjalankan:
dari dalam direktori git repo, yang terbaik untuk saya.
Ini akan menarik semua submodula terbaru termasuk.
sumber
Catatan: Ini dari 2009 dan mungkin bagus tetapi ada pilihan yang lebih baik sekarang.
Kami menggunakan ini. Disebut
git-pup
:Masukkan saja ke direktori bin yang sesuai (/ usr / local / bin). Jika pada Windows, Anda mungkin perlu memodifikasi sintaks untuk membuatnya bekerja :)
Memperbarui:
Menanggapi komentar oleh penulis asli tentang menarik semua KEPALA semua submodula - itu adalah pertanyaan yang bagus.
Saya cukup yakin bahwa
git
tidak memiliki perintah untuk ini secara internal. Untuk melakukannya, Anda perlu mengidentifikasi apa sebenarnya HEAD untuk submodule. Itu bisa sesederhana seperti mengatakanmaster
adalah cabang yang paling up to date, dll ...Setelah ini, buat skrip sederhana yang melakukan hal berikut:
git submodule status
repositori "yang dimodifikasi". Karakter pertama dari garis keluaran menunjukkan ini. Jika sub-repo diubah, Anda mungkin TIDAK ingin melanjutkan.git checkout master && git pull
. Periksa kesalahan.Saya ingin menyebutkan bahwa gaya ini sebenarnya bukan untuk apa git submodules dirancang. Biasanya, Anda ingin mengatakan "LibraryX" ada di versi "2.32" dan akan tetap seperti itu sampai saya kirim ke "upgrade".
Artinya, dalam arti tertentu, apa yang Anda lakukan dengan skrip yang dijelaskan, tetapi hanya secara otomatis. Diperlukan perawatan!
Pembaruan 2:
Jika Anda berada di platform windows, Anda mungkin ingin melihat menggunakan Python untuk mengimplementasikan skrip karena sangat mampu di bidang ini. Jika Anda menggunakan unix / linux, maka saya sarankan hanya bash script.
Perlu klarifikasi? Cukup kirim komentar.
sumber
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
dan kemudian menggunakannyagit pup
tanpa skrip.git submodule init
setelah tarikan pertama yang menyertakan submodul, sehingga semuanya akan mulai berfungsi dengan baik.Henrik ada di jalur yang benar. Perintah 'foreach' dapat menjalankan skrip shell sembarang. Dua opsi untuk menarik yang terbaru mungkin,
dan,
Itu akan beralih melalui semua submodules diinisialisasi dan menjalankan perintah yang diberikan.
sumber
Berikut ini bekerja untuk saya di Windows.
sumber
Edit :
Dalam komentar itu ditunjukkan (oleh philfreo ) bahwa versi terbaru diperlukan. Jika ada submodula bersarang yang perlu dalam versi terbaru mereka:
----- Komentar ketinggalan jaman di bawah ini -----
Bukankah ini cara resmi untuk melakukannya?
Saya menggunakannya setiap waktu. Tidak ada masalah sejauh ini.
Edit:
Saya baru saja menemukan bahwa Anda dapat menggunakan:
Yang juga akan menarik semua submodul secara rekursif, yaitu ketergantungan.
sumber
git submodule update --init --recursive
git submodule foreach --recursive git pull
Seperti yang mungkin terjadi bahwa cabang default dari submodules Anda tidak
master
, ini adalah bagaimana saya mengotomatiskan upgrade submodules Git lengkap:sumber
Pertama kali
Submodule Klon dan Init
Beristirahat
Selama pengembangan, cukup tarik dan perbarui submodule
Perbarui submit Git ke komit terbaru asal
Cara yang disukai harus di bawah
catatan: dua perintah terakhir memiliki perilaku yang sama
sumber
git submodule update
lakukan triknya. Sekarang saya mengunduh data submodul yang hilang dari langkah pertama klon. Terima kasih. Saya tidak pandai git: CSaya tidak tahu karena versi git mana ini berfungsi, tapi itulah yang Anda cari:
Saya menggunakannya
git pull
untuk memperbarui repositori root, juga:sumber
Jawaban di atas bagus, namun kami menggunakan git-hooks untuk mempermudah ini tetapi ternyata di git 2.14 , Anda dapat mengatur
git config submodule.recurse
true untuk mengaktifkan submodules untuk diperbarui ketika Anda menarik ke repositori git Anda.Ini akan memiliki efek samping dari mendorong semua perubahan submodul yang Anda miliki jika ada di cabang, tetapi jika Anda sudah membutuhkan perilaku itu maka ini bisa melakukan pekerjaan.
Dapat dilakukan dengan menggunakan:
sumber
git submodule init
sebelumnya meskipun jika submodule Anda belum diinisialisasi.Git untuk windows 2.6.3 :
git submodule update --rebase --remote
sumber
Dari tingkat atas dalam repo:
Ini akan mengalihkan semua cabang untuk mengembangkan dan menarik terbaru
sumber
git submodule foreach git pull origin master
Harus menambahkan cabang yang ingin saya ambil. selain itu, bekerja dengan sempurna.Saya melakukan ini dengan mengadaptasi jawaban gahooa di atas :
Padukan dengan git
[alias]
...Jika proyek induk Anda memiliki sesuatu seperti ini di
.gitmodules
:Tambahkan sesuatu seperti ini di dalam .gitconfig Anda
Kemudian untuk memperbarui submodula Anda, jalankan:
Saya punya contoh di repo pengaturan lingkungan saya .
sumber
Yang perlu Anda lakukan sekarang adalah sederhana
git checkout
Pastikan untuk mengaktifkannya melalui konfigurasi global ini:
git config --global submodule.recurse true
sumber
Berikut ini adalah baris perintah untuk menarik dari semua repositori git Anda, apakah itu submodules atau tidak:
Jika Anda berjalan di atas git repositori Anda, Anda dapat mengganti
"$ROOT"
ke.
.sumber
Saya pikir Anda harus menulis skrip untuk melakukan ini. Sejujurnya, saya mungkin menginstal python untuk melakukannya sehingga Anda dapat menggunakan
os.walk
untukcd
ke setiap direktori dan mengeluarkan perintah yang sesuai. Menggunakan python atau bahasa skrip lain, selain batch, akan memungkinkan Anda untuk dengan mudah menambah / menghapus sub proyek tanpa harus memodifikasi skrip.sumber
Komentar: cara yang tidak terlalu mudah, tetapi bisa diterapkan dan memiliki kelebihan yang unik.
Jika seseorang ingin mengkloning hanya
HEAD
revisi dari repositori dan hanyaHEAD
s dari semua submodulenya (yaitu untuk checkout "trunk"), maka seseorang dapat menggunakan skrip Lua berikut . Terkadang perintah sederhanagit submodule update --init --recursive --remote --no-fetch --depth=1
dapat menghasilkangit
kesalahan yang tidak dapat dipulihkan . Dalam hal ini kita perlu membersihkan subdirektori dari.git/modules
direktori dan mengklon submodule secara manual menggunakangit clone --separate-git-dir
perintah. Satu-satunya kompleksitas adalah untuk mengetahui URL , jalur.git
direktori submodule dan jalur submodule di pohon superproject.Catatan: skrip hanya diuji terhadap
https://github.com/boostorg/boost.git
repositori. Keunikannya: semua submodules dihosting di host yang sama dan.gitmodules
hanya berisi URL relatif .sumber