Làm thế nào để đối phó với các kho lưu trữ trong kho đã là một câu hỏi liên tục với git. Các mô hình con của Git là một cách để giải quyết tình huống, với chi phí thêm một chút phức tạp để theo dõi. Trang web git có một giới thiệu về mô hình con .
Ý tưởng cơ bản là giữ một tham chiếu đến kho lưu trữ git khác được liên kết với một đường dẫn trên kho lưu trữ của bạn. Các tham chiếu này được lưu trữ trong một tệp .gitmodules
trong thư mục gốc của kho lưu trữ của bạn (được quản lý bởi git, vì vậy hãy để nó một mình). Một số sự phức tạp xuất hiện khi nhân bản một repo có các mô hình con: bạn phải rõ ràng git submodule init
để tạo .gitmodules
tệp và sau đó git submodule update
sao chép các mô hình con.
Đây là hướng dẫn về cách tôi sẽ thêm một plugin vim mới vào kho lưu trữ dotfiles của mình (tôi đã đặt ~/.vim/
bí danh cho nhóm này .vim/
) bằng cách sử dụng một mô hình con:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
Sau đó submodule add
, a git status
sẽ hiển thị rằng bạn đã sửa đổi (hoặc tạo) .gitmodules
tệp, với nội dung như sau:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
Nó cũng sẽ hiển thị .vim/bundle/vim-elixir
như là một tập tin mới. Git xử lý đường dẫn đó đặc biệt ngay bây giờ: đó là một thư mục bình thường trên hệ thống tệp của bạn (vì vậy vim tải nó lên bình thường), nhưng git diff
sẽ coi nó như một cam kết cụ thể từ kho lưu trữ của nó. Khi nhìn vào diffs hoặc log cho đường dẫn đó (ví dụ git log -1 -u .vim/bundle/vim-elixir
), git sẽ hiển thị nó dưới dạng một chuỗi một dòng như thế này:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
Cập nhật lên phiên bản mới nhất của plugin tương ứng với việc đi vào kho lưu trữ của mô hình con và kiểm tra một cam kết mới, sau đó cam kết điều đó với kho lưu trữ của bạn:
$ 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