Bagaimana saya bisa menautkan dependensi dalam git repo?

148

Dalam skrip saya, saya sering menggunakan perpustakaan (milik saya atau orang lain) yang memiliki repo sendiri. Saya tidak ingin menduplikasi yang ada di repo saya dan macet dengan memperbarui mereka setiap kali versi baru keluar. Namun, ketika seseorang mengkloning repo, itu harus tetap bekerja secara lokal dan tidak memiliki tautan rusak.

Ada ide tentang apa yang bisa saya lakukan?

Lea Verou
sumber

Jawaban:

211

Anda dapat melakukannya dengan submodules di git. Di repositori Anda, lakukan:

git submodule add path_to_repo path_where_you_want_it

Jadi, jika repositori perpustakaan memiliki URL git://github.com/example/some_lib.gitdan Anda menginginkannya di lib/some_libdalam proyek Anda, Anda akan memasukkan:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Perhatikan bahwa ini perlu dilakukan dari direktori tingkat atas di repositori Anda. Jadi jangan cdke direktori tempat Anda meletakkannya terlebih dahulu.

Setelah Anda menambahkan submodule, atau setiap kali seseorang melakukan checkout baru dari repositori Anda, Anda harus melakukan:

git submodule init
git submodule update

Dan kemudian semua submodul yang Anda tambahkan akan diperiksa pada revisi yang sama dengan yang Anda miliki.

Saat Anda ingin memperbarui ke versi yang lebih baru dari salah satu perpustakaan, cdmasuk ke submodule dan tarik:

cd lib/some_lib
git pull

Kemudian, ketika Anda melakukan git statusAnda harus melihat lib/somelibtercantum di bagian yang dimodifikasi. Tambahkan file itu, komit, dan Anda terbarui. Ketika seorang kolaborator menarik komit ke dalam repositori mereka, mereka akan melihatnya lib/somelibsebagai dimodifikasi sampai mereka menjalankan git submodule updatelagi.

Emily
sumber
2
Terima kasih atas jawaban Anda, terunggah! (dan mungkin akan menerimanya besok) Apakah ada cara untuk menambahkan hanya satu file dari repo lain sebagai ketergantungan? Atau harus seluruh folder?
Lea Verou
2
Jika Anda ingin melacaknya sebagai submodule (dan karenanya, dapat dengan mudah menarik pembaruan) Anda harus menarik seluruh repositori. Tidak seperti banyak VCS lainnya, git benar-benar hanya ingin berurusan dengan repositori tingkat atas.
Emily
7
baca ini untuk mengetahui apa submodule yang baik untuk dan cara untuk mengatasi masalah potensial. dan diskusi tentang itu .
minghua
1
katakanlah Anda mengimpor sebagai submodule repo lain yang Anda miliki. Bisakah Anda membuat perubahan pada repo asli melalui perubahan lokal Anda di submodule? Katakanlah Anda menemukan bug dan perlu memperbarui yang asli?
andrevenancio
3
Saya tahu ini adalah jawaban lama, tetapi git submodules dapat diperbarui menggunakan git submodule update --remoteSaya sarankan menggunakan lebih banyak flag untuk proyek yang lebih kompleks. Saya menggunakangit submodule update --remote --recursive --init
Chris