Halaman GitPro ini memang merangkum konsekuensi dari pembaruan submodule git dengan baik
Ketika Anda menjalankan git submodule update
, itu memeriksa versi spesifik proyek, tetapi tidak dalam cabang. Ini disebut memiliki kepala terpisah - itu berarti file KEPALA menunjuk langsung ke komit, bukan ke referensi simbolis.
Masalahnya adalah bahwa Anda umumnya tidak ingin bekerja di lingkungan kepala yang terpisah, karena mudah kehilangan perubahan .
Jika Anda melakukan pembaruan submodule awal, komit di direktori submodule itu tanpa membuat cabang untuk dikerjakan, dan kemudian jalankan lagi pembaruan submodule git dari proyek super tanpa melakukan sementara, Git akan menimpa perubahan Anda tanpa memberi tahu Anda. Secara teknis Anda tidak akan kehilangan pekerjaan, tetapi Anda tidak akan memiliki cabang yang menunjuk ke sana, sehingga agak sulit untuk mengambilnya.
Catatan Maret 2013:
Seperti disebutkan dalam " git submodule tracking terkini ", submodule sekarang (git1.8.2) dapat melacak cabang.
# add submodule to track master branch
git submodule add -b master [URL to Git repo];
# update your submodule
git submodule update --remote
# or (with rebase)
git submodule update --rebase --remote
Lihat " git submodule update --remote
vsgit pull
".
MindTooth 's jawaban menggambarkan pembaruan manual (tanpa konfigurasi lokal):
git submodule -q foreach git pull -q origin master
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).
Untuk menghindari masalah ini, buat cabang saat Anda bekerja di direktori submodule dengan git checkout -b work atau sesuatu yang setara. Ketika Anda melakukan pembaruan submodule untuk kedua kalinya, itu masih akan mengembalikan pekerjaan Anda, tetapi setidaknya Anda memiliki pointer untuk kembali ke.
Berpindah cabang dengan submodula di dalamnya juga bisa rumit. Jika Anda membuat cabang baru, tambahkan submodule di sana, dan kemudian beralih kembali ke cabang tanpa submodule itu, Anda masih memiliki direktori submodule sebagai direktori yang tidak dilacak:
Jadi, untuk menjawab pertanyaan Anda:
dapatkah saya membuat cabang / modifikasi dan menggunakan push / pull seperti yang saya lakukan pada repo biasa, atau adakah hal-hal yang perlu diwaspadai?
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.
bagaimana saya memajukan submodule yang direferensikan dari say (tagged) 1.0 ke 1.1 (meskipun kepala repo asli sudah di 2.0)
Halaman " Memahami Submodules " dapat membantu
Git submodules diimplementasikan menggunakan dua bagian yang bergerak:
- yang
.gitmodules
berkas dan
- jenis khusus objek pohon.
Ini bersama-sama melakukan triangulasi revisi tertentu dari repositori tertentu yang diperiksa ke lokasi tertentu di proyek Anda.
Dari halaman git submodule
Anda tidak dapat mengubah konten submodule dari dalam proyek utama
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:
- perlu berkomitmen dan mendorong dalam submodule (ke modul hulu), dan
- kemudian naik di proyek utama Anda, dan komit ulang (agar proyek utama itu merujuk ke submodule komit baru yang baru saja Anda buat dan dorong)
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:
- memiliki siklus hidup mereka sendiri
- memiliki set tag sendiri
- memiliki pengembangan sendiri
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?