Cara mudah untuk menarik terbaru dari seluruh git submodul
Kami're menggunakan git submodul untuk mengelola beberapa proyek-proyek besar yang memiliki ketergantungan pada banyak perpustakaan lain kita've dikembangkan. Masing-masing perpustakaan yang terpisah repo dibawa ke tergantung proyek sebagai submodule. Selama pengembangan, kita sering ingin hanya pergi ambil versi terbaru dari setiap tergantung submodule.
Apakah git memiliki built-in perintah untuk melakukan hal ini? Jika tidak, bagaimana Windows batch file atau serupa yang dapat melakukannya?
1735
19
Jika itu's pertama kali anda checkout repo yang anda butuhkan untuk menggunakan
--init
pertama:Untuk git 1.8.2 atau di atas opsi
--remote
ditambahkan untuk mendukung update ke tips terbaru dari remote cabang:Ini memiliki manfaat tambahan untuk menghormati setiap "non-default" cabang-cabang yang ditentukan dalam
.gitmodules
atau `.git/config file (jika anda kebetulan memiliki, default adalah asal/induk, dalam hal ini beberapa jawaban yang lain di sini akan bekerja dengan baik).Untuk git 1.7.3 atau di atas, anda dapat menggunakan (tapi di bawah gotchas sekitar apa update apakah masih berlaku):
atau:
jika anda ingin menarik anda submodul untuk terbaru melakukan intead apa repo poin.
Lihat git-submodule(1) untuk rincian
Untuk pertama kalinya, anda perlu untuk menjalankan
Di init menjalankan perintah berikut:
dari dalam repo git direktori, karya-karya yang terbaik untuk saya.
Ini akan menarik semua terbaru termasuk submodul.
Dijelaskan
Setelah ini, anda hanya dapat menjalankan:
dari dalam repo git direktori, karya-karya yang terbaik untuk saya.
Ini akan menarik semua terbaru termasuk submodul.
Catatan: Ini adalah dari tahun 2009 dan mungkin telah baik, tetapi ada pilihan yang lebih baik sekarang.
Kami menggunakan ini. It's disebut
git-pup
:Hanya menaruhnya di direktori bin (/usr/local/bin). Jika pada Windows, anda mungkin perlu untuk memodifikasi sintaks untuk mendapatkan itu untuk bekerja :)
Update:
Dalam menanggapi komentar oleh penulis asli tentang menarik di Kepala semua submodul -- itu adalah pertanyaan yang bagus.
Saya cukup yakin bahwa
git
tidak memiliki perintah ini secara internal. Dalam rangka untuk melakukannya, anda akan perlu untuk mengidentifikasi apa yang KEPALA benar-benar adalah untuk submodule. Yang dapat yang sederhana seperti mengatakanmaster
adalah yang paling up to date cabang, dll...Berikut ini, membuat script sederhana yang berikut ini:
git submodule status
untuk "diubah" repositori. Karakter pertama dari baris output menunjukkan hal ini. Jika sub-repo dimodifikasi, anda mungkin TIDAK ingin untuk melanjutkan.I'd ingin menyebutkan bahwa gaya ini tidak benar-benar apa git submodul yang dirancang untuk. Biasanya, anda ingin mengatakan "LibraryX" di versi "2.32" dan akan tetap seperti itu sampai saya kirim ke "meng-upgrade".
Artinya, dalam arti, apa yang anda lakukan dengan yang dijelaskan naskah, tetapi hanya lebih secara otomatis. Perawatan diperlukan!
Update 2:
Jika anda berada di platform windows, anda mungkin ingin melihat menggunakan Python untuk mengimplementasikan script seperti ini sangat mampu di daerah ini. Jika anda berada di unix/linux, maka saya sarankan hanya bash script.
Perlu klarifikasi? Hanya posting komentar.
Henrik berada di jalur yang benar. The 'foreach' perintah dapat mengeksekusi setiap sewenang-wenang shell script. Dua pilihan untuk menarik terbaru yang sangat mungkin,
dan,
Yang akan iterate melalui semua diinisialisasi submodul dan menjalankan perintah yang diberikan.
Berikut ini bekerja untuk saya pada Windows.
Karena mungkin terjadi bahwa cabang default anda adalah submodul tidak
master
, ini adalah bagaimana saya mengotomatisasi penuh Git submodul upgrade:Edit:
Di komentar itu menunjukkan (dengan philfreo ) bahwa versi terbaru diperlukan. Jika ada bersarang submodul yang perlu di versi terbaru mereka :
-----Usang komentar di bawah ini-----
Isn't ini resmi cara untuk melakukannya ?
Saya menggunakannya setiap waktu. Tidak ada masalah sejauh ini.
Edit:
Saya hanya menemukan bahwa anda dapat menggunakan:
Yang juga akan rekursif menarik semua submodul, yaitu dependancies.
Pertama kali waktu
Clone dan Init Submodule
Istirahat
Pembangunan selama ini hanya menarik dan update submodule
Update Git submodule terbaru komit pada asal
Cara yang lebih disukai harus di bawah ini
catatan: ada dua perintah yang memiliki perilaku yang sama
Saya don't tahu sejak versi git ini bekerja, tapi yang's apa yang anda'kembali mencari:
Saya menggunakannya dengan
git pull
untuk memperbarui root repositori, terlalu:Atas jawaban yang baik, namun kami menggunakan git-kait untuk membuat ini lebih mudah tapi ternyata yang di git 2.14, anda dapat mengatur
git config submodule.recurse
ke true untuk mengaktifkan submodul untuk diperbarui ketika anda menarik untuk anda repositori git.Ini akan memiliki efek samping mendorong semua submodul perubahan yang anda miliki jika mereka berada di cabang-cabang, namun tetapi jika anda memiliki kebutuhan bahwa perilaku ini sudah bisa melakukan pekerjaan.
Dapat dilakukan dengan menggunakan:
Melihat http://lists.zerezo.com/git/msg674976.html yang memperkenalkan --melacak parameter
Git untuk windows 2.6.3:
git submodule update-rebase --remote
Dari tingkat atas di repo:
Ini akan beralih semua cabang untuk mengembangkan dan menarik terbaru
Saya melakukan ini dengan beradaptasi gahooa's jawaban atas:
Mengintegrasikan dengan git
[alias]
...Jika anda proyek induk memiliki sesuatu seperti ini dalam
.gitmodules
:Menambahkan sesuatu seperti ini dalam diri anda .gitconfig
Kemudian untuk memperbarui anda submodul, jalankan:
Saya memiliki sebuah contoh itu saya penyiapan lingkungan repo.
Berikut ini adalah command-line untuk menarik dari semua repositori git anda apakah mereka're atau tidak submodul:
Jika anda berjalan di atas repositori git, anda dapat mengganti
"$AKAR"
menjadi.
.Semua yang perlu anda lakukan sekarang adalah sederhana
git checkout
Hanya pastikan untuk mengaktifkan melalui global config:
git config --global submodule.recurse benar
Saya pikir anda'll harus menulis script untuk melakukan hal ini. Jujur, aku mungkin menginstal python untuk melakukannya sehingga anda dapat menggunakan
os.jalan-jalan
untukcd
ke direktori masing-masing dan mengeluarkan perintah yang sesuai. Menggunakan python atau beberapa bahasa scripting, lain dari batch, akan memungkinkan anda untuk dengan mudah menambahkan/menghapus sub-proyek dengan keluar harus memodifikasi script.Catatan: tidak terlalu mudah, tapi bisa diterapkan dan tidak lebih baik.
Jika salah satu ingin mengkloning hanya
KEPALA
revisi repositori dan hanyaKEPALA dari semua submodul (yaitu untuk checkout "batang"), maka salah satu dapat menggunakan berikut *Lua* script. Kadang-kadang perintah sederhana
git submodule update --init --recursive-remote-tidak-fetch-depth=1dapat mengakibatkan dipulihkan
gitkesalahan. Dalam hal ini perlu untuk membersihkan subdirektori
.git/moduldirektori dan clone submodule secara manual menggunakan git clone-terpisah-git-dir
perintah. Satu-satunya kompleksitas adalah untuk mengetahui URL, jalan.git
direktori submodule dan jalan submodule di superproject pohon.Catatan: script ini hanya diuji melawan
https://github.com/boostorg/boost.git
repositori. Kekhasan: semua submodul di-host pada host yang sama dan.gitmodules
hanya berisi relatif URLs.