Repositori Git bersarang?

181

Bisakah saya membuat sarang repositori Git? Saya sudah:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Apakah masuk akal untuk git init/addpara /project_rootuntuk memudahkan pengelolaan segala sesuatu secara lokal atau apakah saya harus mengelola my_projectdan pihak 3 satu secara terpisah?

Jeremy Raymond
sumber

Jawaban:

159

Anda mungkin mencari fitur Git yang disebut submodules . Fitur ini membantu Anda mengelola repositori dependen yang bersarang di dalam repositori utama Anda.

Greg Hewgill
sumber
43
Sebagai git pemula relatif, saya menemukan blog ini / tutorial mudah untuk memahami chrisjean.com/2009/04/20/... Dibutuhkan pendekatan yang lebih sederhana dengan berfokus hanya pada git daripada harus konteks script helper shell; Saya merasa lebih mudah dibaca.
John K
4
Blog chrisjean.com tampaknya tidak terkini hanya karena telah mencoba untuk mengikutinya. Posting wiki dari Greg mungkin sedikit lebih rumit, tetapi sebagai pemula git saya lebih suka akurat daripada sederhana ...
bijak
Blog tampaknya berfungsi dengan baik sekarang, dan sayangnya untuk bijak, 34 (sekarang 35) suara di komentar tampaknya setuju bahwa ada nilai dalam artikel blog. Ternyata Anda tidak harus mengorbankan akurasi untuk kejelasan dan saran khusus operasi. Setelah membacanya, saya akan membayangkan penulis telah meneliti sedikit dan mungkin membaca dokumentasi Git yang sebenarnya , bukan hanya halaman wiki kernel.org. Penjelasan berorientasi penulis blog Git dalam contoh yang sepenuhnya dikontekstualisasikan tampaknya cukup membantu bagi sejumlah besar individu ...
Matthew Weber
13
BTW bahwa tautan chrisjean yang disebutkan di atas sudah mati. Tautan yang diperbarui adalah chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh
35

Tempatkan pustaka pihak ketiga Anda di repositori terpisah dan gunakan submodul untuk menghubungkannya dengan proyek utama. Ini adalah walk-through:

http://git-scm.com/book/en/Git-Tools-Submodules

Dalam memutuskan bagaimana mengelompokkan repo, saya biasanya akan memutuskan berdasarkan seberapa sering saya akan memodifikasinya. Jika itu adalah perpustakaan pihak ketiga dan hanya perubahan yang Anda buat untuk itu adalah peningkatan ke versi yang lebih baru maka Anda harus memisahkannya dari proyek utama.

Igor Zevaka
sumber
22

Hanya untuk kelengkapan:

Ada solusi lain, saya akan merekomendasikan: penggabungan subtree .

Berbeda dengan submodula, lebih mudah dipertahankan. Anda akan membuat setiap repositori dengan cara normal. Saat berada di repositori utama Anda, Anda ingin menggabungkan master (atau cabang lain) dari repositori lain di direktori direktori utama Anda.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Kemudian, untuk menarik repositori lain ke direktori Anda (untuk memperbaruinya), gunakan strategi gabungan subtree:

$ git pull -s subtree OtherRepository master

Saya menggunakan metode ini selama bertahun-tahun sekarang, ini berfungsi :-)

Lebih lanjut tentang cara ini termasuk membandingkannya dengan sub modul dapat ditemukan di dokumentasi git howto ini .

Phil
sumber
Referensi penggabungan subtree ke dalam buku git tidak lagi berfungsi. Saat ini, ini tampaknya tautan: git-scm.com/book/en/v2/…
ericx
18

Anda bisa menambahkan

/project_root/third_party_git_repository_used_by_my_project

untuk

/project_root/.gitignore

yang seharusnya mencegah repo bersarang untuk dimasukkan dalam repo induk, dan Anda dapat bekerja dengannya secara independen.

Tetapi: Jika pengguna menjalankan git clean -dfx di induk repo, itu akan menghapus repo bersarang yang diabaikan. Cara lain adalah dengan symlink folder dan abaikan symlink. Jika Anda kemudian menjalankan git clean, symlink dihapus, tetapi repo 'nested' akan tetap utuh karena benar-benar berada di tempat lain.

mikkelbreum
sumber
5

Ringkasan.

Bisakah saya membuat sarang repositori git?

Iya. Namun, secara default git tidak melacak .gitfolder repositori bersarang. Git memiliki fitur yang dirancang untuk mengelola repositori bersarang (baca terus).

Apakah masuk akal untuk git init / tambahkan / project_root untuk memudahkan pengelolaan segala sesuatu secara lokal atau apakah saya harus mengelola proyek my_project dan pihak ketiga secara terpisah?

Mungkin tidak masuk akal karena git memiliki fitur untuk mengelola repositori bersarang. Fitur bawaan Git untuk mengelola repositori bersarang adalah submoduledan subtree.

Berikut adalah blog tentang topik ini dan di sini adalah pertanyaan SO yang mencakup pro dan kontra dari penggunaan masing-masing.

lachy
sumber
2

Saya akan menggunakan satu repositori per proyek. Dengan begitu, sejarah menjadi lebih mudah dijelajahi.

Saya juga akan memeriksa versi perpustakaan pihak ketiga yang saya gunakan, ke dalam repositori proyek yang menggunakannya.

Agak
sumber