Saya menggunakan submodules Git. Setelah menarik perubahan dari server, berkali-kali kepala submodule saya terlepas dari cabang utama.
Mengapa itu terjadi?
Saya harus selalu melakukan:
git branch
git checkout master
Bagaimana saya bisa memastikan bahwa submodule saya selalu menunjuk ke cabang master?
git
git-submodules
om471987
sumber
sumber
Jawaban:
EDIT:
Lihat @Simba Answer untuk solusi yang valid
JAWABAN TUA:
Secara pribadi saya benci jawaban di sini yang mengarahkan ke tautan eksternal yang mungkin berhenti bekerja dari waktu ke waktu dan memeriksa jawaban saya di sini (Kecuali jika pertanyaan itu rangkap) - mengarahkan ke pertanyaan yang mencakup subjek di antara baris subjek lain, tetapi secara keseluruhan sama dengan: "Saya tidak menjawab, baca dokumentasinya. "
Jadi kembali ke pertanyaan: Mengapa itu terjadi?
Situasi yang Anda jelaskan
Ini adalah kasus umum ketika seseorang tidak terlalu sering menggunakan submodul atau baru saja memulai dengan submodul . Saya percaya bahwa saya benar dalam menyatakan, bahwa kita semua telah ada di suatu titik di mana KEPALA submodul kita terlepas.
Solusi: Pastikan submodule Anda melacak cabang yang benar
Solusi: Buat submodule Anda melacak cabang jarak jauh dengan menambahkan submodul baru dengan dua perintah berikut.
<branch>
.Dalam kasus-kasus umum, Anda sudah memperbaiki HEAD DETACHED Anda sekarang karena itu terkait dengan salah satu masalah konfigurasi di atas.
memperbaiki KEPALA RINCI ketika
.update = checkout
Tetapi jika Anda berhasil membuat beberapa perubahan secara lokal sudah untuk submodule dan melakukan, mendorong ini ke remote maka ketika Anda menjalankan 'git checkout', Git memberi tahu Anda:
Opsi yang disarankan untuk membuat cabang sementara bisa bagus, dan kemudian Anda bisa menggabungkan cabang-cabang ini dll. Namun saya pribadi akan menggunakan hanya
git cherry-pick <hash>
dalam kasus ini.Meskipun ada beberapa kasus lagi, Anda bisa mendapatkan submodul Anda ke status HEAD DETACHED, saya harap Anda sekarang mengerti sedikit lebih banyak tentang cara men-debug kasus khusus Anda.
sumber
git submodule update --remote
. Silakan lihat jawaban Simba, saya pikir itu seharusnya jawaban yang tepat.Menambahkan
branch
opsi di.gitmodule
adalah TIDAK terkait dengan perilaku terpisah dari submodul sama sekali. Jawaban lama dari @mkungla salah, atau usang.Dari
git submodule --help
, HEAD detached adalah perilaku default darigit submodule update --remote
.Pertama, tidak perlu menentukan cabang yang akan dilacak .
origin/master
adalah cabang default yang akan dilacak.Mengapa
Jadi mengapa HEAD terlepas setelah
update
? Hal ini disebabkan oleh perilaku pembaruan modul default:checkout
.Untuk menjelaskan perilaku pembaruan yang aneh ini, kita perlu memahami bagaimana cara kerja submodula?
Kutipan dari Starting with Submodules dalam buku Pro Git
Repo utama melacak submodule dengan statusnya pada titik tertentu , id komit . Jadi, ketika Anda memperbarui modul, Anda memperbarui id komit ke yang baru.
Bagaimana
Jika Anda ingin submodule digabung dengan cabang jarak jauh secara otomatis, gunakan
--merge
atau--rebase
.Yang perlu Anda lakukan adalah,
Alias yang disarankan:
Ada juga opsi untuk membuat
--merge
atau--rebase
sebagai perilaku defaultgit submodule update
, dengan mengatursubmodule.$name.update
kemerge
ataurebase
.Berikut adalah contoh tentang cara mengkonfigurasi perilaku pembaruan default pembaruan submodule di
.gitmodule
.Atau konfigurasikan di baris perintah,
Referensi
git submodule --help
sumber
git submodule update --remote --merge
, dan itu menarik submodule dalam keadaan terpisah. Juga dicoba--rebase
dengan hasil yang sama.cd
ke dalam submodule, checkout submodule ke cabang tertentu dengangit checkout master
,.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Tetapi bagaimana saya bisa mencegah agar git tidak selalu melepaskan mereka? Pengaturan opsi konfigurasi untuk setiap submodule bukan pilihan!git submodule update --remote --merge
tidak meninggalkan submodule dalam keadaan HEAD terpisah, tetapi berjalangit submodule update
setelah mengedit.gitmodule
file saya saat Anda menunjukkan DID meninggalkan submodule dalam keadaan HEAD terpisah.Aku bosan selalu melepaskannya jadi aku hanya menggunakan skrip shell untuk membangunnya untuk semua modul saya. saya berasumsi semua submodule ada di master: ini skripnya:
jalankan dari modul induk Anda
sumber
Lihat jawaban saya di sini: Git submodules: Tentukan cabang / tag
Jika mau, Anda dapat menambahkan baris "branch = master" ke dalam file .gitmodules Anda secara manual. Baca tautan untuk melihat apa yang saya maksud.
EDIT: Untuk melacak proyek submodule yang ada di cabang, ikuti instruksi VonC di sini sebagai gantinya:
Git submodules: Tentukan cabang / tag
sumber
branch = master" line into your .gitmodule
jawaban sebenarnya, yang memecahkan masalah itu untuk saya.Cara lain untuk membuat submodule Anda untuk memeriksa cabang adalah dengan membuka
.gitmodules
file di folder root dan menambahkan bidangbranch
dalam konfigurasi modul sebagai berikut:branch = <branch-name-you-want-module-to-checkout>
sumber
branch = my_wanted_branch
. Tetapi menjalankannyagit submodule update --remote
masih memeriksa sebagai kepala terpisah.Seperti yang dikatakan orang lain, alasan ini terjadi adalah bahwa repo induk hanya berisi referensi ke (SHA1 dari) komit tertentu dalam submodule - tidak tahu apa-apa tentang cabang. Beginilah seharusnya: cabang yang berada di komit itu mungkin telah bergerak maju (atau mundur), dan jika repo induk mereferensikan cabang maka itu dapat dengan mudah pecah ketika itu terjadi.
Namun, terutama jika Anda secara aktif berkembang di kedua induk repo dan submodule,
detached HEAD
negara dapat membingungkan dan berpotensi berbahaya. Jika Anda membuat komitmen dalam submodule saat sedang dalamdetached HEAD
keadaan, ini menjadi menggantung dan Anda dapat dengan mudah kehilangan pekerjaan Anda. (Menggantung komit biasanya bisa diselamatkan menggunakangit reflog
, tapi jauh lebih baik untuk menghindari mereka di tempat pertama.)Jika Anda seperti saya, maka sebagian besar waktu jika ada cabang dalam submodule yang menunjuk ke komit yang diperiksa, Anda lebih suka memeriksa cabang itu daripada berada dalam keadaan HEAD yang terlepas pada komit yang sama. Anda dapat melakukan ini dengan menambahkan alias berikut ke
gitconfig
file Anda :Sekarang, setelah melakukan
git submodule update
Anda hanya perlu menelepongit submodule-checkout-branch
, dan setiap submodule yang diperiksa pada komit yang memiliki cabang menunjuk ke sana akan memeriksa cabang itu. Jika Anda tidak sering memiliki beberapa cabang lokal semuanya menunjuk ke komit yang sama, maka ini biasanya akan melakukan apa yang Anda inginkan; jika tidak, maka setidaknya itu akan memastikan bahwa setiap komit yang Anda lakukan pergi ke cabang yang sebenarnya alih-alih dibiarkan menggantung.Selain itu, jika Anda telah mengatur git untuk secara otomatis memperbarui submodules pada checkout (menggunakan
git config --global submodule.recurse true
, lihat jawaban ini ), Anda dapat membuat post-checkout hook yang memanggil alias ini secara otomatis:Maka Anda tidak perlu menelepon salah satu
git submodule update
ataugit submodule-checkout-branch
, hanya melakukangit checkout
akan memperbarui semua submodul ke komitmen masing-masing dan memeriksa cabang yang sesuai (jika ada).sumber
Solusi paling sederhana adalah:
Kemudian cd di direktori repo dan:
Bacaan tambahan: Dapatkan praktik terbaik submodul .
sumber