Saya tidak jelas tentang apa artinya berikut ini (dari dokumentasi pembaruan submodule Git ):
... akan membuat submodules HEAD terlepas, kecuali
--rebase
atau--merge
ditentukan ...
Bagaimana --rebase
/ --merge
perubahan hal?
Kasus penggunaan utama saya adalah memiliki banyak repositori sentral, yang akan saya embed melalui submodul ke dalam repositori lain. Saya ingin dapat memperbaiki repositori sentral ini, baik secara langsung di lokasi asli mereka, atau dari dalam repositori embedding mereka (yang menggunakannya melalui submodule).
- Dari dalam submodul ini, dapatkah saya membuat cabang / modifikasi dan menggunakan push / pull seperti yang saya lakukan di repositori biasa, atau adakah hal-hal yang perlu diwaspadai?
- Bagaimana saya memajukan submodule yang direferensikan komit dari say (tagged) 1.0 ke 1.1 (meskipun kepala repositori asli sudah di 2.0), atau memilih komit cabang yang digunakan sama sekali?
git
git-submodules
biru tua
sumber
sumber
Jawaban:
Halaman GitPro ini memang merangkum konsekuensi dari pembaruan submodule git dengan baik
Catatan Maret 2013:
Seperti disebutkan dalam " git submodule tracking terkini ", submodule sekarang (git1.8.2) dapat melacak cabang.
Lihat "
git submodule update --remote
vsgit pull
".MindTooth 's jawaban menggambarkan pembaruan manual (tanpa konfigurasi lokal):
Dalam kedua kasus, itu akan mengubah referensi submodul ( gitlink , entri khusus dalam indeks repo induk ), dan Anda perlu menambahkan, komit, dan mendorong referensi yang disebutkan dari repo utama.
Lain kali Anda akan mengkloning repo induk, itu akan mengisi submodules untuk mencerminkan referensi SHA1 baru.
Sisa dari jawaban ini merinci fitur submodule klasik (referensi ke komit tetap , yang merupakan titik di belakang gagasan submodule).
Jadi, untuk menjawab pertanyaan Anda:
Anda dapat membuat cabang dan mendorong modifikasi.
PERINGATAN (dari Git Submodule Tutorial ): Selalu terbitkan (dorong) perubahan submodule sebelum menerbitkan (dorong) perubahan ke proyek super yang merujuknya. Jika Anda lupa mempublikasikan perubahan submodule, orang lain tidak akan dapat mengkloning repositori.
Halaman " Memahami Submodules " dapat membantu
Ini bersama-sama melakukan triangulasi revisi tertentu dari repositori tertentu yang diperiksa ke lokasi tertentu di proyek Anda.
Dari halaman git submodule
100% benar: Anda tidak dapat mengubah submodule, hanya merujuk ke salah satu dari komitmennya.
Inilah sebabnya, ketika Anda memodifikasi submodule dari dalam proyek utama, Anda:
Sebuah submodule memungkinkan Anda untuk memiliki pengembangan pendekatan berbasis komponen , di mana proyek utama hanya merujuk pada komitmen spesifik dari komponen lain (di sini "repositori Git lain yang dinyatakan sebagai sub-modul").
Sebuah submodule adalah penanda (komit) ke repositori Git lain yang tidak terikat oleh siklus pengembangan proyek utama: ia (yang lain "repositori Git) dapat berkembang secara independen.
Terserah proyek utama untuk memilih dari repo lain apa pun yang diperlukan komit.
Namun, jika Anda ingin, dari kenyamanan , memodifikasi salah satu dari submodula tersebut langsung dari proyek utama Anda, Git memungkinkan Anda untuk melakukan itu, asalkan Anda pertama kali mempublikasikan modifikasi submodule tersebut ke repo Git aslinya, dan kemudian melakukan proyek utama Anda dengan merujuk pada a baru versi submodule kata.
Tetapi ide utamanya tetap: merujuk komponen-komponen spesifik yang:
Daftar komit spesifik yang Anda rujuk dalam proyek utama Anda menentukan konfigurasi Anda (ini adalah tentang Manajemen Konfigurasi , melibatkan Sistem Kontrol Versi belaka )
Jika komponen benar-benar dapat dikembangkan pada saat yang sama dengan proyek utama Anda (karena setiap modifikasi pada proyek utama akan melibatkan memodifikasi sub-direktori, dan sebaliknya), maka itu akan menjadi "submodule" tidak lebih, tetapi sebuah subtree merge (juga disajikan dalam pertanyaan Mentransfer basis kode lama dari cvs ke repositori terdistribusi ), yang menghubungkan sejarah kedua repo Git secara bersamaan.
Apakah itu membantu memahami sifat sebenarnya dari Submodules Git?
sumber
svn:externals
.git submodule foreach
Untuk memperbarui setiap submodule, Anda bisa menjalankan perintah berikut (di root repositori):
Anda dapat menghapus opsi -q untuk mengikuti seluruh proses.
sumber
git submodule update --init --recursive
dari root, itu akan mendapatkan semuanya secara rekursif dan menginisialisasi mereka jika belum.git submodule update --rebase --remote
Untuk mengatasi opsi
--rebase
vs--merge
.:Katakanlah Anda memiliki super repositori A dan submodule B dan ingin melakukan beberapa pekerjaan dalam submodule B. Anda telah melakukan pekerjaan rumah Anda dan tahu bahwa setelah menelepon
git submodule update
Anda berada dalam kondisi tanpa HEAD, sehingga setiap komitmen yang Anda lakukan pada saat ini sulit untuk kembali. Jadi, Anda sudah mulai bekerja pada cabang baru di submodule B
Sementara itu, orang lain dalam proyek A telah memutuskan bahwa versi B terbaru dan terhebat benar-benar layak untuk A. Anda, karena kebiasaan, menggabungkan perubahan terbaru ke bawah dan memperbarui submodul Anda.
Oh tidak! Anda kembali dalam keadaan tanpa kepala lagi, mungkin karena B sekarang menunjuk ke SHA yang terkait dengan tip baru B, atau komit lainnya. Andai saja Anda memiliki:
Sekarang ide terbaik untuk B telah diubah menjadi komit baru, dan yang lebih penting, Anda masih berada di cabang pengembangan Anda untuk B, bukan dalam keadaan tanpa kepala!
(
--merge
Akan menggabungkan perubahan dari sebelumUpdateSHA ke afterUpdateSHA ke cabang kerja Anda, sebagai lawan rebasing perubahan Anda ke afterUpdateSHA.)sumber
Git 1.8.2 menampilkan opsi baru
--remote
,, yang akan mengaktifkan perilaku ini dengan tepat. Lariakan mengambil perubahan terbaru dari hulu di setiap submodule, rebase mereka, dan periksa revisi terbaru submodule. Seperti yang dijelaskan dalam dokumentasi :
Ini sama dengan menjalankan
git pull
di setiap submodule, yang umumnya persis seperti yang Anda inginkan.(Ini disalin dari jawaban ini .)
sumber