Proyek git-subrepo sudah ada sejak lama, namun ada beberapa referensi untuk itu. Penulis git-subrepo adalah Ingy dรถt Net .
Jika Anda melihat sejarah komitmen dari cabang utama proyek, mungkin terlihat bahwa proyek berhenti dalam pengembangan 2 tahun yang lalu. Namun, pekerjaan pada proyek sedang berlangsung dan saya harap versi 0.4.0 akan segera dirilis.
Properti penting dari alat ini adalah tidak perlu bagi pengguna untuk menginstal git-subrepo sampai pengguna memutuskan untuk membuat komitmen dalam repositori hulu dari sub proyek. Selain itu, pengguna menerima pohon sumber yang sepenuhnya siap dan dikonfigurasi pada saat menyalin repositori utama menggunakan perintah standar git-klon (1) .
Ketika memilih cara untuk mendukung submodul / sub-proyek / sub-proyek dari repositori wadah utama, pengembang pertama-tama menentukan kisaran kemampuan yang disediakan mekanisme ini dan itu dan menjawab pertanyaan-pertanyaan berikut:
- apakah perlu untuk menyimpan riwayat lengkap dari proyek dalam repositori utama atau cukup komitmen terjepit;
- apakah kemampuan untuk mengirimkan perubahan dari subproyek ke repositori hulu subtree diperlukan;
- Apakah ada kebutuhan untuk menghubungkan tag tetap dari repositori hulu dari proyek atau apakah mungkin untuk menghubungkan cabang;
- apakah akan perlu untuk menghapus lebih lanjut kedua sub proyek itu sendiri dan, yang telah menjadi tidak perlu, bagian dari sejarah subproyek ini;
- apakah pengguna harus mengambil tindakan apa pun untuk mengkonfigurasi subproyek secara manual setelah mengkloning repositori proyek utama;
- bagaimana melelahkan akan menjadi pertanyaan menganalisis sejarah menghubungkan subproyek dan revisi spesifik dari mana sub proyek berasal;
- bagaimana alat ini atau itu akan mempengaruhi kebijakan Manajemen Konfigurasi Sumber dan seberapa banyak alat ini akan menyulitkan pekerjaan sehari-hari para insinyur.
Tentu saja, daftar pertanyaan ini tidak dapat mencerminkan kepenuhan parameter input yang diperlukan untuk pilihan yang tepat, tetapi untuk peninjauan awal alat yang ada, cukup memadai dan, berbicara tentang proyek git-subrepo , kami mendesak pembaca untuk mempertimbangkan proyek ini dari posisi ini.
Instalasi git-subrepo
Paket git-subrepo , di pihak pengembang, dapat diinstal secara lokal, di direktori home-nya, dan di level sistem.
Dalam kasus pertama, cukup untuk mengkloning repositori git-subrepo ke direktori yang diinginkan, misalnya, ~ / bin :
bash-4.4$ cd ~/bin bash-4.4$ git clone https://github.com/ingydotnet/git-subrepo.git
dan mengatur variabel lingkungan
bash-4.4$ vim subrepo-env.sh
Jika Anda melihat variabel yang didefinisikan dalam Makefile git-subrepo :
# Install variables: PREFIX ?= /usr/local INSTALL_LIB ?= $(DESTDIR)$(shell git --exec-path) INSTALL_EXT ?= $(INSTALL_LIB)/$(NAME).d INSTALL_MAN1 ?= $(DESTDIR)$(PREFIX)/share/man/man1
mudah untuk mengetahui bahwa pada tingkat sistem, git-subrepo dipasang di direktori tempat Git berada:
bash-4.4$ bash-4.4$ git --exec-path /usr/libexec/git-core bash-4.4$
Jadi, perintah untuk menginstal git-subrepo mungkin terlihat, misalnya, sebagai berikut:
bash-4.4$ make PREFIX=/usr install
Kehadiran variabel DESTDIR memungkinkan kita untuk membuat paket untuk setiap distribusi Linux tanpa upaya tambahan (tentu saja, jika kita tidak berada dalam lingkungan lintas), yang dapat berguna bagi para insinyur DevOps.
Instal git-subrepo sebagai root:
bash-4.4$ bash-4.4$ cd git-subrepo/ bash-4.4$ make PREFIX=/usr install install -C -d -m 0755 /usr/libexec/git-core/ install -C -m 0755 lib/git-subrepo /usr/libexec/git-core/ install -C -d -m 0755 /usr/libexec/git-core/git-subrepo.d/ install -C -m 0755 lib/git-subrepo.d/help-functions.bash lib/git-subrepo.d/bash+.bash /usr/libexec/git-core/git-subrepo.d/ install -C -d -m 0755 /usr/share/man/man1/ install -C -m 0644 man/man1/git-subrepo.1 /usr/share/man/man1/ bash-4.4$
Untuk menganalisis kemampuan git-subrepo, kita memerlukan lingkungan pengujian sederhana tempat kita dapat mereproduksi skenario operasi standar.
Lingkungan uji
Kami membuat tiga pemilik direktori, remote , pengguna , di mana kami menempatkan model repositori hulu dan lokal pengembang dan pengguna.
bash-4.4$ vim _init.sh
Di sini
Penulis proyek dan pengguna memiliki salinan repositori hulu mereka sendiri pada mesin mereka, yang disajikan dalam contoh kami di masing-masing direktori pemilik dan pengguna .
Tugas penulis adalah memasukkan fitur-fitur berikut di pohon utama platform dengan memasukkan sub - proyek sistem builld di pohon utama:
- klon repositori utama dengan sub - proyek build-system yang termasuk dalam strukturnya dan jangan khawatir tentang pengaturan versi atau revisi. Yaitu, setiap cabang repositori platform harus sesuai dengan revisi spesifik cabang tertentu repositori build-system dan pengguna harus menerima pohon sumber khusus dalam satu operasi git-klon (1) , tanpa tindakan tambahan.
- mengirimkan perubahan mereka ke repositori proyek hulu, baik di utama maupun di tambahan.
- menerima perubahan yang dibuat oleh peserta atau pengguna proyek lain, tentu saja, jika mereka memiliki hak yang sesuai.
Pertimbangkan tindakan penulis yang harus dia terapkan untuk menerapkan persyaratan ini.
Koneksi Subproyek
Untuk menghubungkan subtree baru, gunakan perintah git subrepo clone , yang tujuannya mirip dengan perintah git-clone (1) . Parameter yang diperlukan untuk perintah adalah URL repositori jarak jauh. Anda juga dapat menentukan direktori tempat subproyek dan cabang repositori jarak jauh akan berlokasi. Kami akan bekerja dengan cabang master, oleh karena itu, dalam contoh kami, kami mengabaikan parameter perintah yang tidak perlu.
Jadi, penulis proyek, pada mesin kerjanya, dapat menghubungkan subproyek build-system menggunakan git subrepo clone ../../remote/build-system.git/ perintah build-system :
bash-4.4$ bash-4.4$ cd owner/platform/ bash-4.4$ git subrepo clone ../../remote/build-system.git/ build-system Subrepo '../../remote/build-system.git' (master) cloned into 'build-system'. bash-4.4$
Pertimbangkan perubahan apa yang terjadi di repositori platform lokal:
bash-4.4$ bash-4.4$ git status On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean bash-4.4$ bash-4.4$ bash-4.4$ git subrepo status 1 subrepo: Git subrepo 'build-system': Remote URL: ../../remote/build-system.git Upstream Ref: b2f5079 Tracking Branch: master Pulled Commit: b2f5079 Pull Parent: b5e76a7 bash-4.4$
Sejarah subproyek sistem bangun tidak dikirim ke pohon utama, kami hanya memiliki satu komit terjepit, yang disertai dengan informasi latar belakang. Informasi ini berada di bawah kendali versi dalam file ./build-system/.gitrepo/config :
[subrepo] remote = ../../remote/build-system.git branch = master commit = b2f507918f2821cb7dd90c33223ed5cc3c9922a2 parent = b5e76a713f895565b06ee3ccfa29f19131ba06dd method = merge cmdver = 0.4.1
Informasi tentang subproyek dapat diperoleh dengan menggunakan perintah git subrepo config , misalnya, untuk mengetahui revisi remote project / build-system.git , yang baru saja tiba di repositori utama, menggunakan perintah:
bash-4.4$ bash-4.4$ git subrepo config build-system commit Subrepo 'build-system' option 'commit' has value 'b2f507918f2821cb7dd90c33223ed5cc3c9922a2'. bash-4.4$
Harus disebutkan bahwa paket git-subrepo yang asli tidak menyimpan informasi tentang subproyek dalam file .gitrepo / config , tetapi dalam file .gitrepo .
Jadi, kami mendapatkan versi terbaru dari cabang utama remote repositori / build-system.git dan menempatkannya di subdirektori build-system dari proyek platform utama.
Untuk mengirimkan perubahan ini ke remote / platform.git repositori hulu, penulis perlu menjalankan perintah git push :
bash-4.4$ bash-4.4$ git push Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 4 threads Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 849 bytes | 849.00 KiB/s, done. Total 6 (delta 0), reused 0 (delta 0) To /home/prog/0.4.1/remote/platform.git <font color="#8b0000">b5e76a7..6b831e4</font> master -> master bash-4.4$
Informasi lebih lanjut tentang perintah git subrepo dapat diperoleh dari file ReadMe.pod atau di baris perintah
bash-4.4$ git subrepo help <command>
misalnya:
bash-4.4$ git subrepo help clone
Pertimbangkan sekarang semua yang terjadi di pihak pengguna.
Mendapatkan kode oleh pengguna
Saat ini, ketika pengguna belum menerima pembaruan ke platform repositori upstream. Git, salinannya berisi satu file README
bash-4.4$ bash-4.4$ cd user/platform/ bash-4.4$ ls README bash-4.4$
mengandung satu baris:
bash-4.4$ bash-4.4$ cat README [master] platform 1.0.0 bash-4.4$
Setelah memecah perubahan repositori hulu
bash-4.4$ bash-4.4$ git pull remote: Enumerating objects: 7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (4/4), done. remote: Total 6 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (6/6), done. From /home/prog/0.4.1/remote/platform b5e76a7..6b831e4 master -> origin/master Updating <font color="#8b0000">b5e76a7..6b831e4</font> Fast-forward build-system/.gitrepo/config | 12 ++++++++++++ build-system/README | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 build-system/.gitrepo/config create mode 100644 build-system/README bash-4.4$
pengguna akan dapat memiliki kode proyek proyek -bangun dari revisi persis yang penulis proyek tentukan. Pengguna dapat memperbarui revisi saat ini kapan saja menggunakan perintah config :
bash-4.4$ bash-4.4$ git subrepo config build-system/ commit Subrepo 'build-system' option 'commit' has value 'b2f507918f2821cb7dd90c33223ed5cc3c9922a2'. bash-4.4$
Perlu dicatat bahwa pengguna tidak perlu membuat pengaturan tambahan dan ia dapat mengandalkan fakta bahwa penulis proyek memberinya revisi sistem pembangunan yang diperlukan agar versi platform saat ini dapat berfungsi.
Inilah yang dicari oleh penulis proyek.
Kirim perubahan ke proyek hulu
Misalkan sekarang bahwa pengguna kami adalah anggota proyek dan diizinkan untuk mengirimkan perubahan tidak hanya ke repositori remote / platform.git , tetapi juga ke repositori hulu dari subproyek remote / build-system.git .
Lalu jika pengguna melakukan perubahan:
bash-4.4$ bash-4.4$ cd build-system/ bash-4.4$ vim README bash-4.4$ cat README [master] build-system 1.0.1 bash-4.4$ bash-4.4$ git commit -a -m "update BS version to 1.0.1" [master d30b001] update BS version to 1.0.1 1 file changed, 1 insertion(+), 1 deletion(-) bash-4.4$ bash-4.4$ cd .. bash-4.4$ git log commit d30b001286b08708f5c30c1f5346a90e4339f969 (HEAD -> master) Author: user <___@_____> Date: Tue Oct 30 10:49:32 2018 +0300 update BS version to 1.0.1 . . . bash-4.4$
ia akan dapat menempatkannya di repositori hulu sebagai berikut:
bash-4.4$ bash-4.4$ git subrepo push build-system/ Subrepo 'build-system' pushed to '../../remote/build-system.git' (master). bash-4.4$
Penting untuk dicatat di sini bahwa ...Karena file-file konfigurasi dari subproyek .gitrepo / config disimpan di bawah kontrol versi, pengguna perlu mengirimkan perubahan status dari sub proyek ke repositori hulu dari remote proyek utama / platform.git .
Artinya, pengguna tidak boleh lupa memeriksa status repositori lokal dan menjalankan perintah git-push (1) tepat waktu.
bash-4.4$ bash-4.4$ git status On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean bash-4.4$ bash-4.4$ git push Enumerating objects: 14, done. Counting objects: 100% (14/14), done. Delta compression using up to 4 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (9/9), 992 bytes | 992.00 KiB/s, done. Total 9 (delta 1), reused 0 (delta 0) To /home/prog/0.4.1/remote/platform.git d00be9f..deccb66 master -> master bash-4.4$
Jika tidak, saat berikutnya Anda membuat perubahan pada repositori hulu, itu akan menerima konflik gabungan.
Tentu saja, tidak ada yang aneh di sini, namun, setelah menjalankan perintah git subrepo push ... , mudah untuk melupakan keadaan salinan lokal dari repositori utama.
Bekerja langsung dengan repositori hulu
Sekarang pertimbangkan apa yang terjadi di repositori remote / build-system.git
bash-4.4$ bash-4.4$ cd owner/build-system/ bash-4.4$ bash-4.4$ git pull remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From /home/prog/0.4.1/remote/build-system b2f5079..d229920 master -> origin/master Updating b2f5079..d229920 Fast-forward README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) bash-4.4$ bash-4.4$ git log commit d229920c7de34405bc7b8d47f36d420987687908 (HEAD -> master, origin/master) Author: user <___@_____> Date: Tue Oct 30 10:49:32 2018 +0300 update BS version to 1.0.1 commit b2f507918f2821cb7dd90c33223ed5cc3c9922a2 Author: user <___@_____> Date: Tue Oct 30 10:05:30 2018 +0300 init build-system master 1.0.0 bash-4.4$
Artinya, penulis proyek menerima perubahan yang dibuat oleh peserta proyek.
Tentu saja, penulis dapat membuat perubahan langsung ke repositori hulu dari proyek sistem-bangun :
bash-4.4$ bash-4.4$ cd owner/build-system/ bash-4.4$ bash-4.4$ vim README bash-4.4$ cat README [master] build-system 1.0.2 bash-4.4$ git commit -a -m "update build-system version to 1.0.2" [master 8255f59] update build-system version to 1.0.2 1 file changed, 1 insertion(+), 1 deletion(-) bash-4.4$ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Writing objects: 100% (3/3), 281 bytes | 281.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To /home/prog/0.4.1/remote/build-system.git d229920..8255f59 master -> master bash-4.4$
Dan semua peserta, serta pengguna proyek utama, akan dapat menerima perubahan ini menggunakan perintah git subrepo pull
bash-4.4$ bash-4.4$ cd owner/platform/ bash-4.4$ bash-4.4$ git subrepo pull build-system/ Subrepo 'build-system' pulled from '../../remote/build-system.git' (master). bash-4.4$ git status On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean bash-4.4$ git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 4 threads Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 670 bytes | 670.00 KiB/s, done. Total 6 (delta 1), reused 0 (delta 0) To /home/prog/0.4.1/remote/platform.git 6b831e4..b6f4a7b master -> master bash-4.4$
Kesimpulan
Jika pengembang tidak perlu menyimpan sejarah sub-proyek dalam repositori utama dan, ketika mengirimkan kode, ia beroperasi dengan cabang daripada tag tetap, maka git-subrepo sangat cocok untuk mengatur pekerjaan sehari-hari.
Secara kondisional, salah satu kelemahan dari git-subrepo adalah kenyataan bahwa operasi git subrepo clone hanya mungkin terkait dengan cabang-cabang subproyek. Dengan kata lain, pengguna tidak dapat menghubungkan sub proyek yang merujuk pada tag tetapnya atau revisi tertentu, yaitu perintah seperti
bash-4.4$ git subrepo clone ../../remote/build-system.git build-system -t 1.0.1 bash-4.4$ git subrepo clone ../../remote/build-system.git build-system 7f5d1113eb0bc6
tidak valid
SASTRA: