Rumah > Peranti teknologi > industri IT > Memahami dan bekerja dengan submodul dalam git

Memahami dan bekerja dengan submodul dalam git

Joseph Gordon-Levitt
Lepaskan: 2025-02-10 15:58:09
asal
130 orang telah melayarinya

Understanding and Working with Submodules in Git

Projek perisian moden kebanyakannya bergantung kepada hasil kerja projek lain. Jika orang lain telah menulis penyelesaian yang sangat baik dan anda mencipta semula roda dalam kod anda, ia akan menjadi satu pembaziran masa yang besar. Inilah sebabnya mengapa banyak projek menggunakan kod pihak ketiga, seperti perpustakaan atau modul.

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

    Submodul Git adalah cara yang kuat dan mudah untuk menguruskan perpustakaan pihak ketiga dalam projek dan dengan jelas mengasingkan mereka dari pangkalan kod utama. Mereka adalah repositori git standard yang diletakkan di repositori git induk yang lain.
  • Menambah submodul ke projek melibatkan membuat folder berasingan, kemudian menggunakan perintah "Git Submodule Add", diikuti oleh URL perpustakaan yang dikehendaki. Ini klon repositori ke dalam projek sebagai submodule, memisahkannya dari repositori projek utama.
  • Apabila mengkloning projek yang mengandungi submodule git, submodule akan secara automatik dimulakan dan diklon menggunakan pilihan "--recurse-submodules" dalam perintah "klon git". Jika anda tidak melakukan ini, folder submodule akan kosong selepas pengklonan dan perlu dihuni dengan "Git Submodule Update - -init - -recursive".
  • Dalam submodule git, versi tertentu diperiksa, bukan cawangan, yang membolehkan kawalan sepenuhnya ke atas kod tepat yang digunakan dalam projek utama. Mengemas kini submodul melibatkan menggunakan "Kemas Kini Submodule Git", diikuti dengan nama submodule.

Pastikan pemisahan kod

dengan jelas menggambarkan mengapa submodul git adalah struktur yang berharga, mari kita lihat kes di mana

tidak 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.

  • Peraturan umum "memisahkan perkara yang berbeza" dalam pembangunan perisian tidak masuk akal. Hal ini terutama berlaku untuk menguruskan kod pihak ketiga dalam projek anda sendiri. Nasib baik, konsep submodule Git direka untuk situasi ini.
  • 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!

    Walau bagaimanapun, anda boleh memikirkan seni bina submodule Git dengan beberapa kelebihan:

      Submodul menyediakan antara muka yang konsisten dan boleh dipercayai -tanpa mengira bahasa atau kerangka yang anda gunakan. Jika anda menggunakan pelbagai teknologi, masing -masing mungkin mempunyai pengurus pakej sendiri dan set peraturan dan arahannya sendiri. Sebaliknya, submodul sentiasa berfungsi dengan cara yang sama.
    • Mungkin tidak semua kod tersedia melalui Pengurus Pakej. Mungkin anda hanya ingin berkongsi kod anda sendiri antara dua projek - dalam kes ini, submodule boleh memberikan proses yang paling mudah.

    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
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Apabila kita menjalankan perintah ini, git klon repositori ke dalam projek kami sebagai submodul:

    $ git submodule add https://github.com/spencermountain/spacetime.git
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Anda mungkin bertanya, "Apa perbezaannya?" Perbezaan utama ialah mereka termasuk dalam repositori git mereka sendiri

    ! 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. Understanding and Working with Submodules in Git

    Mari lihat apa lagi yang sedang berlaku: Fail .GitModules baru dicipta dalam folder Root Projek utama. Berikut adalah kandungannya:

    $ mkdir lib
    $ cd lib
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    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
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    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: Understanding and Working with Submodules in Git

    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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    klon projek yang mengandungi submodule git
    <code>[submodule "lib/spacetime"]
      path = lib/spacetime
      url = https://github.com/spencermountain/spacetime.git</code>
    Salin selepas log masuk
    Salin selepas log masuk

    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
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    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
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    Jika kita kini kembali ke projek utama kami dan laksanakan status submodule git sekali lagi, kami akan melihat checkout 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>
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk
    datang untuk melihat output: simbol sebelum hash SHA-1 memberitahu kita bahawa versi submodule berbeza dari versi yang kini disimpan dalam repositori induk. Oleh kerana kami hanya menukar versi yang diperiksa, ini kelihatan betul.

    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>
    Salin selepas log masuk
    Salin selepas log masuk
    anda dapat melihat bahawa Git merawat penunjuk submodule yang bergerak sebagai perubahan yang sama seperti perubahan lain: Jika kita mahu menyimpannya, kita perlu melakukan repositori:

    <code>[submodule "lib/spacetime"]
      url = https://github.com/spencermountain/spacetime.git
      active = true</code>
    Salin selepas log masuk

    Kemas kini submodule git

    Dalam langkah -langkah di atas, kami

    diri 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
    Salin selepas log masuk
    Garis terakhir menunjukkan bahawa sesuatu dalam submodul telah diubah. Tetapi mari kita lihat lebih dekat:

    $ git commit -m "Add timezone converter library as a submodule"
    Salin selepas log masuk
    Saya percaya anda masih ingat bahawa bilangan kecil: ini bermakna penunjuk submodule telah bergerak! Untuk mengemas kini versi checkout tempatan kami ke versi "rasmi" yang dipilih oleh rakan sepasukan kami, kami boleh menjalankan arahan kemas kini:

    $ git submodule status
       ea703a7d557efd90ccae894db96368d750be93b6 lib/spacetime (6.16.3)
    Salin selepas log masuk
    okay! Submodul kami kini diperiksa kepada versi yang direkodkan dalam repositori projek utama kami!

    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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan