Bagaimana cara git submodule add -b
kerjanya?
Setelah menambahkan submodule dengan cabang tertentu, repositori baru yang dikloning (setelah git submodule update --init
) akan berada di komit tertentu, bukan cabang itu sendiri ( git status
pada submodule menunjukkan "Tidak saat ini di cabang mana pun").
Saya tidak dapat menemukan informasi tentang .gitmodules
atau .git/config
tentang cabang submodule atau komit tertentu, jadi bagaimana cara Git mengetahuinya?
Selain itu, apakah mungkin untuk menentukan tag bukan cabang?
Saya menggunakan versi 1.6.5.2.
git
git-submodules
Ivan
sumber
sumber
Jawaban:
Catatan: Git 1.8.2 menambahkan kemungkinan untuk melacak cabang. Lihat beberapa jawaban di bawah ini.
Agak membingungkan untuk membiasakan diri dengan hal ini, tetapi submodula tidak ada di cabang. Mereka, seperti yang Anda katakan, hanyalah sebuah penunjuk ke komit tertentu dari repositori submodule.
Ini berarti, ketika orang lain memeriksa repositori Anda, atau menarik kode Anda, dan melakukan pembaruan submodule, submodule tersebut diperiksa oleh komit tertentu.
Ini bagus untuk submodule yang tidak sering berubah, karena dengan demikian semua orang di proyek dapat memiliki submodule pada komit yang sama.
Jika Anda ingin memindahkan submodule ke tag tertentu:
Kemudian, pengembang lain yang ingin memiliki submodule_directory berubah menjadi tag itu, melakukan ini
git pull
perubahan yang menunjukkan direktori submodule mereka.git submodule update
sebenarnya menyatu dalam kode baru.sumber
cd my_submodule; git checkout [ref in submodule's repository
hasil panenfatal: reference is not a tree: ...
. Seolah-olahgit
hanya akan beroperasi di repositori induk.git checkout v1.0
cabang atau tag?Saya ingin menambahkan jawaban di sini yang sebenarnya hanya konglomerat dari jawaban lain, tetapi saya pikir ini mungkin lebih lengkap.
Anda tahu Anda memiliki submission Git ketika Anda memiliki dua hal ini.
Anda
.gitmodules
memiliki sebuah entri seperti:Anda memiliki objek submodule (bernama SubmoduleTestRepo dalam contoh ini) di repositori Git Anda. GitHub menunjukkan ini sebagai objek "submodule". Atau lakukan
git submodule status
dari baris perintah. Objek submit Git adalah jenis khusus objek Git, dan mereka menyimpan informasi SHA untuk komit tertentu.Setiap kali Anda melakukan
git submodule update
, itu akan mengisi submodule Anda dengan konten dari komit. Ia tahu di mana menemukan komit karena informasi dalam.gitmodules
.Sekarang, yang harus
-b
dilakukan adalah menambahkan satu baris dalam.gitmodules
file Anda . Jadi mengikuti contoh yang sama, akan terlihat seperti ini:Objek submodule masih menunjuk komit tertentu. Satu-satunya
-b
pilihan yang dibeli oleh Anda adalah kemampuan untuk menambahkan--remote
bendera pada pembaruan Anda sesuai jawaban Vogella:Alih-alih mengisi konten submodule ke komit yang ditunjuk oleh submodule, itu menggantikan komit dengan komit terbaru di cabang master, MAKA ia mengisi submodule dengan komit itu. Ini dapat dilakukan dalam dua langkah dengan jawaban djacobs7. Karena Anda sekarang telah memperbarui komit objek submodule menunjuk, Anda harus komit objek submodule yang diubah ke repositori Git Anda.
git submodule add -b
bukan cara ajaib untuk menjaga semuanya tetap up to date dengan cabang. Itu hanya menambahkan informasi tentang cabang dalam.gitmodules
file dan memberi Anda pilihan untuk memperbarui objek submodule ke komit terbaru dari cabang tertentu sebelum mengisinya.sumber
.gitmodules
dan setelah melakukan$ git submodule update --init --remote TestModule
saya mendapat kesalahan mengatakanfatal: Needed a single revision
danUnable to find current origin/TestTag revision in submodule path 'TestModule'
. Ketika melakukannya dengan cabang nyata itu berfungsi. Apakah ada cara menetapkan tag.gitmodules
tanpa harus menentukan komit yang tepat?.gitmodules
dan larigit submodule update
dan tidak ada yang terjadi?(Git 2.22, Q2 2019, telah diperkenalkan
git submodule set-branch --branch aBranch -- <submodule_path>
)Perhatikan bahwa jika Anda memiliki yang ada submodule yang tidak melacak cabang belum , maka ( jika Anda memiliki 1.8.2+ git ):
Pastikan repo induk tahu bahwa submodule-nya sekarang melacak cabang:
Pastikan submodule Anda paling lambat dari cabang itu:
(dengan 'asal' menjadi nama repo jarak jauh hulu , submodule telah dikloning.
Bagian
git remote -v
dalam submodule akan menampilkannya. Biasanya, itu 'asal')Jangan lupa untuk mencatat status submodule baru Anda di repo orang tua Anda:
Pembaruan berikutnya untuk submodule itu harus menggunakan
--remote
opsi:Perhatikan bahwa dengan Git 2.10+ (Q3 2016), Anda dapat menggunakan '
.
' sebagai nama cabang:Tapi, seperti dikomentari oleh LubosD
Itu berarti Git 2.23 (Agustus 2019) atau lebih.
Lihat " Bingung oleh
git checkout
"Jika Anda ingin memperbarui semua submodul Anda mengikuti cabang:
Perhatikan bahwa hasilnya, untuk setiap submodule yang diperbarui, akan hampir selalu menjadi HEAD terpisah , seperti yang dicatat Dan Cameron dalam jawabannya .
( Clintm mencatat dalam komentar bahwa, jika Anda menjalankan
git submodule update --remote
dan sha1 yang dihasilkan sama dengan cabang saat submodule aktif, ia tidak akan melakukan apa pun dan membiarkan submodule tetap "pada cabang itu" dan tidak dalam keadaan kepala terpisah. )Untuk memastikan cabang benar-benar diperiksa (dan itu tidak akan mengubah SHA1 dari entri khusus yang mewakili submodule untuk repo induk), ia menyarankan:
Setiap submodule masih akan mereferensikan SHA1 yang sama, tetapi jika Anda membuat komitmen baru, Anda akan bisa mendorongnya karena dirujuk oleh cabang yang Anda ingin submodule dilacak.
Setelah dorongan dalam submodule, jangan lupa untuk kembali ke induk repo, tambahkan, komit dan tekan SHA1 baru untuk submodul yang dimodifikasi.
Perhatikan penggunaan
$toplevel
, direkomendasikan dalam komentar oleh Alexander Pogrebnyak .$toplevel
diperkenalkan di git1.7.2 pada Mei 2010: commit f030c96 .dtmland
menambahkan komentar :Perintah yang sama tetapi lebih mudah dibaca:
umläute memurnikan perintah dtmland dengan versi yang disederhanakan dalam komentar :
beberapa baris:
Sebelum Git 2.26 (Q1 2020), pengambilan yang diperintahkan untuk secara rekursif mengambil pembaruan dalam submodul pasti menghasilkan rim output, dan itu menjadi sulit untuk menemukan pesan kesalahan.
Perintah telah diajarkan untuk menyebutkan submodul yang memiliki kesalahan pada akhir operasi .
Lihat komit 0222540 (16 Jan 2020) oleh Emily Shaffer (
nasamuffin
) .(Digabung oleh Junio C Hamano -
gitster
- dalam commit b5c71cc , 05 Feb 2020)sumber
foreach
Script tidak akan tergantung pada hardcoded<path>
, jika Anda mengganti<path>
dengan$toplevel/
.foreach
Script akan gagal untuk submodul checkout yang tidak mengikuti cabang. Namun, perintah ini memberi Anda berdua:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
git submodule update --remote --merge
ataugit submodule update --remote --rebase
. Perintah-perintah ini melakukan pelacakan cabang jarak jauh.Git 1.8.2 menambahkan kemungkinan untuk melacak cabang.
Lihat juga Git submodules
sumber
.gitmodules
file?git submodule add -b tags/<sometag> <url>
mana Anda dapat melihat sebagai garisbranch = tags/<sometag>
di.gitmodules
Contoh cara saya menggunakan submit Git.
Dan itu terlihat sedikit seperti ini:
Mungkin ini membantu (meskipun saya menggunakan tag dan bukan cabang)?
sumber
git reset --hard V3.1.2
? Saya hanya mendapatkan "tidak ada komitmen" dengangit status
direktori induk.Dalam pengalaman saya beralih cabang di proyek super atau checkout di masa depan masih akan menyebabkan kepala HEADs submodules terlepas apakah submodule ditambahkan dan dilacak dengan benar (yaitu @ djacobs7 dan @Johnny Z jawaban).
Dan bukannya secara manual memeriksa cabang yang benar secara manual atau melalui skrip submodule git dapat digunakan.
Ini akan memeriksa file konfigurasi submodule untuk properti cabang dan checkout cabang yang ditetapkan.
git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'
sumber
Git submodules agak aneh - mereka selalu dalam mode "kepala terpisah" - mereka tidak memperbarui ke komit terbaru pada cabang seperti yang Anda harapkan.
Ini masuk akal ketika Anda memikirkannya. Katakanlah saya membuat repositori foo dengan bilah submodule . Saya mendorong perubahan saya dan memberitahu Anda untuk memeriksa melakukan a7402be dari repositori foo .
Kemudian bayangkan seseorang melakukan perubahan pada bilah repositori sebelum Anda dapat membuat klon Anda.
Ketika Anda memeriksa komit a7402be dari repositori foo , Anda berharap untuk mendapatkan kode yang sama saya mendorong. Itu sebabnya submodul tidak diperbarui sampai Anda memberi tahu mereka secara eksplisit dan kemudian membuat komit baru.
Secara pribadi saya pikir submodul adalah bagian yang paling membingungkan dari Git. Ada banyak tempat yang dapat menjelaskan submodul lebih baik daripada saya. Saya merekomendasikan Pro Git oleh Scott Chacon.
sumber
git clone git://github.com/git/git.git
dan dorong fitur itu ...? = DUntuk beralih cabang untuk submodule (dengan asumsi Anda sudah memiliki submodule sebagai bagian dari repositori):
cd
untuk me-root repositori Anda yang berisi submodules.gitmodules
untuk dieditpath = ...
danurl = ...
mengatakanbranch = your-branch
, untuk setiap submodule; simpan file.gitmodules
.$ git submodule update --remote
... ini harus menarik komit terbaru pada cabang yang ditentukan, untuk setiap submodule yang dimodifikasi.
sumber
Saya memilikinya di file .gitconfig saya. Ini masih konsep, tetapi terbukti bermanfaat sampai sekarang. Ini membantu saya untuk selalu menempelkan kembali submodul ke cabang mereka.
sumber
Kami menggunakan Quack untuk menarik modul tertentu dari repositori Git lain. Kita perlu menarik kode tanpa seluruh basis kode dari repositori yang disediakan - kita membutuhkan modul / file yang sangat spesifik dari repositori besar itu dan harus diperbarui setiap kali kita menjalankan pembaruan.
Jadi kami mencapainya dengan cara ini:
Buat konfigurasi
Dengan konfigurasi di atas, ia membuat satu direktori dari repositori GitHub yang disediakan sebagaimana ditentukan dalam konfigurasi modul pertama, dan yang lainnya adalah untuk menarik dan membuat file dari repositori yang diberikan.
Pengembang lain hanya perlu dijalankan
Dan itu menarik kode dari konfigurasi di atas.
sumber
Satu-satunya efek dari memilih cabang untuk submodule adalah bahwa, setiap kali Anda melewati
--remote
opsi digit submodule update
baris perintah, Git akan memeriksa dalam mode HEAD terlepas (jika--checkout
perilaku default dipilih) komit terbaru dari cabang jauh yang dipilih .Anda harus sangat berhati-hati saat menggunakan fitur pelacakan cabang jarak jauh ini untuk submodula Git jika Anda bekerja dengan klon submodul yang dangkal. Cabang yang Anda pilih untuk tujuan ini dalam pengaturan submodule BUKAN cabang yang akan dikloning selama
git submodule update --remote
. Jika Anda lulus juga--depth
parameternya dan Anda tidak memberi tahu Git tentang cabang mana yang ingin Anda klon - dan sebenarnya Anda tidak bisa digit submodule update
baris perintah !! -, ia akan secara implisit berperilaku seperti dijelaskan dalamgit-clone(1)
dokumentasigit clone --single-branch
ketika--branch
parameter eksplisit hilang, dan karena itu akan mengkloning cabang utama saja .Tanpa mengherankan, setelah tahap kloning dilakukan oleh
git submodule update
perintah, akhirnya akan mencoba untuk memeriksa komit terbaru untuk cabang jarak jauh yang sebelumnya Anda atur untuk submodule, dan, jika ini bukan yang utama, itu bukan bagian dari klon dangkal lokal Anda, dan karenanya akan gagal dengansumber
git submodule add -b mengembangkan --name branch-name - https: //branch.git
sumber