Bagaimana menangani repositori-dalam-repositori telah menjadi pertanyaan berkelanjutan dengan git. Submodules Git adalah salah satu cara mengatasi situasi, dengan mengorbankan menambahkan sedikit lebih banyak kerumitan untuk melacak. Situs git memiliki pengantar submodul .
Ide dasarnya adalah untuk menyimpan referensi ke repositori git lain yang terkait dengan path di repositori Anda. Referensi-referensi ini disimpan dalam file .gitmodules
di root repositori Anda (yang dikelola oleh git, jadi biarkan saja). Beberapa kerumitan muncul saat kloning repo yang memiliki submodul: Anda harus secara eksplisit git submodule init
membuat .gitmodules
file, dan kemudian git submodule update
mengkloning submodul.
Berikut ini adalah langkah-langkah tentang bagaimana saya akan menambahkan plugin vim baru ke repositori dotfiles saya (saya telah ~/.vim/
alias untuk repo ini .vim/
) menggunakan submodule:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Setelah itu submodule add
, a git status
akan menunjukkan bahwa Anda telah memodifikasi (atau membuat) .gitmodules
file, dengan sesuatu seperti ini:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Itu juga harus ditampilkan .vim/bundle/vim-elixir
sebagai file baru. Git memperlakukan jalur itu secara khusus sekarang: ini adalah direktori normal pada sistem file Anda (jadi vim memuatnya secara normal), tetapi git diff
akan memperlakukannya sebagai komit khusus dari repositori. Ketika melihat diffs atau log untuk path tersebut (misal git log -1 -u .vim/bundle/vim-elixir
), git akan menampilkannya sebagai string satu baris seperti ini:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
Memperbarui ke versi terbaru dari plugin terkait dengan masuk ke repositori submodule dan memeriksa komit baru, dan kemudian melakukan itu ke repositori Anda:
$ cd .vim/bundle/vim-elixir
$ git remote -v # note: the submodule repo's origin, not my repo's
origin https://github.com/elixir-lang/vim-elixir.git (fetch)
origin https://github.com/elixir-lang/vim-elixir.git (push)
$ git pull
# ...
$ cd - # back to my repository's root
$ git status
# ...
modified: .vim/bundle/vim-elixir (new commits)
$ git diff .vim/bundle/vim-elixir
# ...
-Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
+Subproject commit d59784e7afbd0d55c501e40c43b57cbe6f6e04c2
$ git commit -m "update vim-elixir" .vim/bundle/vim-elixir