Git, sistem kawalan versi yang paling popular di dunia, menyediakan cara yang elegan dan berkuasa untuk menguruskan kebergantungan ini. Konsepnya "submodul" membolehkan kita memasukkan dan mengurus perpustakaan pihak ketiga sambil mengekalkannya dengan jelas dari kod kita sendiri.
Artikel ini akan menjelaskan mengapa submodul git sangat berguna, apa sebenarnya mereka dan bagaimana mereka berfungsi.
mata utama
Pastikan pemisahan kod
dengan jelas menggambarkan mengapa submodul git adalah struktur yang berharga, mari kita lihat kes di manatidak mempunyai submodul . Apabila anda perlu memasukkan kod pihak ketiga, seperti perpustakaan sumber terbuka, anda boleh memilih cara yang mudah: hanya muat turun kod dari GitHub dan letakkan di suatu tempat dalam projek anda. Walaupun kaedah ini sangat cepat, ia pasti tidak bersih kerana beberapa sebab: Dengan secara paksa menyalin kod pihak ketiga ke dalam projek anda, anda sebenarnya mencampurkan pelbagai projek ke dalam satu projek. Barisan antara projek anda sendiri dan projek orang lain (perpustakaan) mula kabur. Setiap kali anda perlu mengemas kini kod perpustakaan (kerana penyelenggara menyediakan ciri baru yang hebat atau membetulkan pepijat yang serius), anda perlu memuat turun, menyalin dan tampal lagi. Ini tidak lama lagi akan menjadi proses yang membosankan.
Sudah tentu, submodul bukan satu -satunya penyelesaian kepada masalah tersebut. Anda juga boleh menggunakan pelbagai sistem "Pengurus Pakej" yang disediakan oleh banyak bahasa dan kerangka moden. Tidak ada yang salah dengan melakukan ini!
intipati submodule git
submodules dalam git sebenarnya hanya repositori git standard. Tidak ada inovasi mewah, hanya repositori git yang sama yang kita semua sangat akrab sekarang. Ini juga merupakan sebahagian daripada kuasa submodul: mereka sangat kuat dan langsung kerana mereka begitu "kering" dari sudut pandang teknikal dan diuji dengan baik.Satu -satunya perkara yang membuat repositori git modul kanak -kanak adalah bahawa ia terletak di dalam ibu bapa yang lain
Git Repository . Selain itu, submodule git masih merupakan repositori yang berfungsi sepenuhnya: anda boleh melakukan semua yang anda sudah tahu dari kerja git biasa - dari mengubah fail untuk melakukan, menarik, dan menolak. Segala -galanya dalam submodule adalah mungkin.
Tambah Submodule
Mari kita ambil contoh klasik sebagai contoh, katakan kita mahu menambah perpustakaan pihak ketiga ke projek itu. Adalah masuk akal untuk membuat folder berasingan untuk menyimpan kandungan tersebut sebelum kami mendapat kod:
Sekarang kami sudah bersedia untuk mengimport beberapa kod pihak ketiga ke dalam projek kami menggunakan submodul dengan cara yang teratur. Katakan kita memerlukan Perpustakaan JavaScript "Zon Masa" kecil:
$ mkdir lib $ cd lib
Apabila kita menjalankan perintah ini, git klon repositori ke dalam projek kami sebagai submodul:
$ git submodule add https://github.com/spencermountain/spacetime.git
Jika kita melihat folder salinan kerja kita, kita dapat melihat bahawa fail perpustakaan sebenarnya telah tiba di projek kami.
<code>Cloning into 'carparts-website/lib/spacetime'... remote: Enumerating objects: 7768, done. remote: Counting objects: 100% (1066/1066), done. remote: Compressing objects: 100% (445/445), done. remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702 Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done. Resolving deltas: 100% (5159/5159), done.</code>
! Jika kami hanya memuat turun beberapa fail, buangnya ke dalam projek kami, dan lakukannya -seperti seluruh projek kami -mereka akan menjadi sebahagian daripada repositori Git yang sama. Walau bagaimanapun, submodule memastikan bahawa fail perpustakaan tidak "bocor" ke dalam repositori projek utama kami.
$ mkdir lib $ cd lib
fail .GitModules ini adalah salah satu daripada beberapa lokasi untuk submodul dalam projek penjejakan Git. Yang lain adalah .git/config, yang kini berakhir seperti berikut:
$ git submodule add https://github.com/spencermountain/spacetime.git
Akhirnya, Git juga menyimpan salinan repositori .git setiap submodule dalam folder .GIT/Modul Dalaman.
Semua ini adalah butiran teknikal yang anda tidak perlu ingat. Walau bagaimanapun, ia mungkin membantu untuk memahami bahawa penyelenggaraan dalaman submodul git agak rumit. Itulah sebabnya satu perkara yang penting untuk diingat: jangan mengubah suai konfigurasi submodule git secara manual! Sekiranya anda ingin bergerak, padamkan atau beroperasi submodul, janganlah mencuba, jangan cuba ini secara manual. Anda boleh menggunakan arahan git yang sesuai atau gui desktop git seperti "menara" dan ia akan mengendalikan butiran ini untuk anda.
mari kita lihat status projek utama setelah kita menambah submodul:
Seperti yang anda lihat, Git merawat menambah submodul sebagai perubahan yang sama seperti perubahan lain. Oleh itu, kita harus melakukan perubahan ini seperti perubahan lain:
<code>Cloning into 'carparts-website/lib/spacetime'... remote: Enumerating objects: 7768, done. remote: Counting objects: 100% (1066/1066), done. remote: Compressing objects: 100% (445/445), done. remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702 Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done. Resolving deltas: 100% (5159/5159), done.</code>
klon projek yang mengandungi submodule git
<code>[submodule "lib/spacetime"] path = lib/spacetime url = https://github.com/spencermountain/spacetime.git</code>
Dalam contoh kami di atas, kami menambah submodule baru ke repositori Git yang sedia ada. Tetapi, "sebaliknya," apa yang berlaku apabila anda mengklon repositori yang sudah mengandungi submodule ?
Jika kita melaksanakan klon git biasa & lt; url jauh & gt; Ini sekali lagi dengan jelas membuktikan bahawa fail submodule adalah bebas dan tidak termasuk dalam repositori induk mereka. Dalam kes ini, untuk mengisi submodule selepas mengkloning repositori induknya, anda hanya boleh melakukan kemas kini submodule git -init - -recursive. Cara yang lebih baik adalah untuk secara langsung menambah pilihan-recurse-submodules apabila klon git kali pertama dipanggil.
Versi checkout
Dalam repositori git "biasa", kami biasanya menyemak cawangan. Dengan menggunakan Git Checkout & lt; Nama Cawangan & GT; Apabila komit baru dibuat di cawangan ini, penunjuk kepala secara automatik akan bergerak
ke komit terkini. Penting untuk memahami ini - kerana submodul git berfungsi dengan cara yang berbeza!Dalam submodules, kami sentiasa menyemak versi tertentu -bukan cawangan! Walaupun anda melaksanakan perintah yang serupa dengan Git Checkout utama dalam submodule, di latar belakang, terkini terkini komit
di cawangan itu dilog masuk - bukan cawangan itu sendiri.Sudah tentu, tingkah laku ini bukan kesilapan. Pertimbangkan ini: Apabila anda memasukkan perpustakaan pihak ketiga, anda ingin mengawal sepenuhnya kod tepat yang anda gunakan dalam projek utama anda. Ini hebat apabila penyelenggara perpustakaan mengeluarkan versi baru ... tetapi anda tidak semestinya mahu menggunakan versi baru ini secara automatik dalam projek anda. Kerana anda tidak tahu sama ada perubahan baru ini akan memecahkan projek anda!
Jika anda ingin mengetahui versi yang digunakan oleh submodule anda, anda boleh meminta maklumat ini dalam projek utama:
$ mkdir lib $ cd lib
Ini akan mengembalikan versi yang kini diperiksa oleh submodul Lib/SpaceTime kami. Ia juga membolehkan kita tahu bahawa versi ini adalah tag yang dipanggil "6.16.3". Adalah biasa untuk menggunakan tag dengan banyak apabila menggunakan submodul git.
Katakan anda mahu submodul anda menggunakan versi lama , ditandakan "6.14.0". Pertama, kita perlu menukar direktori supaya perintah Git kita akan dilaksanakan dalam konteks submodule, bukan projek utama kita. Kemudian kita hanya boleh menjalankan git checkout dengan nama tag:
$ git submodule add https://github.com/spencermountain/spacetime.git
<code>Cloning into 'carparts-website/lib/spacetime'... remote: Enumerating objects: 7768, done. remote: Counting objects: 100% (1066/1066), done. remote: Compressing objects: 100% (445/445), done. remote: Total 7768 (delta 615), reused 975 (delta 588), pack-reused 6702 Receiving objects: 100% (7768/7768), 4.02 MiB | 7.78 MiB/s, done. Resolving deltas: 100% (5159/5159), done.</code>
memanggil status git dalam projek utama kami sekarang juga memberitahu kami tentang fakta ini:
<code>[submodule "lib/spacetime"] path = lib/spacetime url = https://github.com/spencermountain/spacetime.git</code>
<code>[submodule "lib/spacetime"] url = https://github.com/spencermountain/spacetime.git active = true</code>
Kemas kini submodule git
Dalam langkah -langkah di atas, kamidiri kami memindahkan penunjuk submodule: Kami adalah mereka yang memilih untuk menyemak versi yang berbeza, menyerahkannya, dan menolaknya ke repositori jauh pasukan kami. Tetapi bagaimana jika rakan sekerja kami mengubah versi submodule - mungkin kerana versi baru yang menarik dari submodule telah dikeluarkan dan rakan sekerja kami memutuskan untuk menggunakannya dalam projek kami (selepas ujian menyeluruh, tentu saja ...).
mari kita laksanakan tarik git mudah dalam projek utama - kerana kita boleh melakukannya sering - untuk mendapatkan perubahan baru dari repositori jauh dikongsi:
$ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: .gitmodules new file: lib/spacetime
$ git commit -m "Add timezone converter library as a submodule"
$ git submodule status ea703a7d557efd90ccae894db96368d750be93b6 lib/spacetime (6.16.3)
Menggunakan git submodule
kami telah menutup blok bangunan asas menggunakan submodul git. Aliran kerja lain sangat standard!Contohnya, menyemak perubahan baru dalam submodules seperti dalam repositori Git lain: anda menjalankan perintah pengambilan git di repositori submodule dan jika anda ingin menggunakan kemas kini, anda mungkin akan menjalankan sesuatu seperti git pull asal selepas itu utama perintah.
Mengubah submodul juga boleh berfungsi untuk anda, terutamanya jika anda menguruskan kod perpustakaan sendiri (kerana ia adalah perpustakaan dalaman, bukan dari pihak ketiga). Anda boleh menggunakan submodul seperti yang anda lakukan dengan mana -mana repositori git lain: anda boleh membuat perubahan, komited mereka, menolaknya, dan banyak lagi.
Dapatkan kuasa git
Git mempunyai ciri -ciri yang kuat di belakang tabir. Walau bagaimanapun, banyak alat lanjutan, seperti submodul git, tidak diketahui. Ramai pemaju terlepas banyak ciri yang kuat, yang benar -benar kasihan!
Jika anda ingin menggali lebih mendalam ke dalam beberapa teknologi git maju yang lain, saya sangat mengesyorkan "Toolkit Git Advanced": Ini adalah koleksi video pendek (percuma!) Memilih dan juga strategi cawangan.
Saya doakan anda pemaju yang lebih baik!
soalan yang sering ditanya mengenai submodul git
Apakah submodule git? Git submodule adalah cara untuk memasukkan repositori git lain sebagai subdirektori ke repositori git anda sendiri. Ia membolehkan anda mengekalkan repositori yang berasingan sebagai subproject dalam projek utama.
Mengapa menggunakan submodule git? Submodul Git berguna untuk menggabungkan repositori luaran ke dalam projek anda, terutamanya jika anda ingin memisahkan sejarah pembangunan mereka dari projek utama. Ini sangat bermanfaat untuk menguruskan kebergantungan atau termasuk perpustakaan luaran.
Maklumat apa yang disimpan dalam projek utama mengenai submodule? Projek utama menyimpan URL dan komit hash dari submodule dalam entri khas dalam repositori induk. Ini membolehkan sesiapa yang mengklonkan projek utama untuk mengklonkan submodul yang dirujuk juga.
bagaimana untuk mengklon repositori git yang mengandungi submodul? Apabila mengkloning repositori yang mengandungi submodul, anda boleh secara automatik memulakan dan mengklon submodul menggunakan bendera -recursive perintah klon git. Sebagai alternatif, anda boleh menggunakan Kemas Kini Submodule Git -init selepas pengklonan.
Bolehkah saya bersarang submodul? Ya, Git menyokong submodul bersarang, yang bermaksud bahawa submodul boleh mengandungi submodul sendiri. Walau bagaimanapun, menguruskan submodul bersarang boleh menjadi rumit dan anda mesti memastikan bahawa setiap submodule diasaskan dan dikemas kini dengan betul.
Atas ialah kandungan terperinci Memahami dan bekerja dengan submodul dalam git. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!