Kho Git lồng nhau?


181

Tôi có thể lồng kho Git không? Tôi có:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Liệu nó có ý nghĩa với git init/addviệc /project_rootdễ dàng quản lý mọi thứ tại địa phương hay tôi phải quản lý riêng my_projectvà bên thứ 3?

Câu trả lời:


159

Bạn có thể đang tìm kiếm tính năng Git được gọi là mô đun con . Tính năng này giúp bạn quản lý các kho lưu trữ phụ thuộc được lồng bên trong kho lưu trữ chính của bạn.


43
Là một người mới bắt đầu git tương đối, tôi thấy blog / hướng dẫn này dễ hiểu hơn về chrisjean.com/2009/04/20/ Từ Nó cần một cách tiếp cận đơn giản hơn bằng cách tập trung vào chỉ git thay vì có bối cảnh của một kịch bản trình bao trợ giúp; Tôi thấy nó dễ đọc hơn.
John K

4
Blog chrisjean.com dường như không hiện tại dựa trên việc bạn đã cố gắng theo dõi nó. Bài đăng wiki từ Greg có thể phức tạp hơn một chút, nhưng với tư cách là một người mới, tôi thích chính xác đến đơn giản ...
hiền nhân

Blog dường như hoạt động tốt bây giờ, và thật không may cho sage, 34 người (hiện 35 tuổi) bình luận về bình luận dường như đồng ý rằng có một giá trị trong bài viết blog. Hóa ra bạn không phải hy sinh độ chính xác để có lời khuyên rõ ràng và cụ thể cho hoạt động. Sau khi đọc nó, tôi sẽ tưởng tượng tác giả đã nghiên cứu một chút và có thể đọc tài liệu Git thực tế , không chỉ trang wiki kernel.org. Giải thích theo định hướng Git của tác giả blog trong một ví dụ hoàn toàn theo ngữ cảnh dường như khá hữu ích cho một số lượng lớn cá nhân ...
Matthew Weber

13
BTW mà liên kết chrisjean đã đề cập ở trên đã chết. Liên kết được cập nhật là chrisjean.com/git-submodules-adding-USE-removing-and-updating
spksh

35

Đặt thư viện bên thứ ba của bạn vào một kho lưu trữ riêng biệt và sử dụng các mô hình con để liên kết chúng với dự án chính. Đây là một hướng dẫn:

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

Khi quyết định cách phân đoạn một repo, tôi thường sẽ quyết định dựa trên tần suất tôi sẽ sửa đổi chúng. Nếu đó là thư viện của bên thứ ba và chỉ những thay đổi bạn đang thực hiện thì nó đang nâng cấp lên phiên bản mới hơn thì bạn chắc chắn nên tách nó khỏi dự án chính.


22

Chỉ để hoàn thiện:

Có một giải pháp khác, tôi muốn giới thiệu: sáp nhập cây con .

Ngược lại với mô đun con, nó dễ bảo trì hơn. Bạn sẽ tạo mỗi kho lưu trữ theo cách thông thường. Khi ở trong kho lưu trữ chính của bạn, bạn muốn hợp nhất chủ (hoặc bất kỳ nhánh nào khác) của kho lưu trữ khác trong một thư mục của thư mục chính của bạn.

$ 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"`

Sau đó, để kéo kho lưu trữ khác vào thư mục của bạn (để cập nhật nó), hãy sử dụng chiến lược hợp nhất cây con:

$ git pull -s subtree OtherRepository master

Tôi đang sử dụng phương pháp này trong nhiều năm nay, nó hoạt động :-)

Thông tin thêm về cách này bao gồm so sánh nó với các mô-đun phụ có thể được tìm thấy trong tài liệu git howto doc này .


Tham chiếu hợp nhất cây con vào cuốn sách git không còn hoạt động. Hiện tại, đây có vẻ là liên kết: git-scm.com/book/en/v2/ Kẻ
ericx

18

Bạn có thể thêm

/project_root/third_party_git_repository_used_by_my_project

đến

/project_root/.gitignore

điều đó sẽ ngăn chặn repo lồng nhau được bao gồm trong repo cha và bạn có thể làm việc với chúng một cách độc lập.

Nhưng: Nếu người dùng chạy git clean -dfx trong repo cha, nó sẽ xóa repo lồng nhau bị bỏ qua. Một cách khác là symlink thư mục và bỏ qua symlink. Nếu sau đó bạn chạy git sạch, symlink sẽ bị xóa, nhưng repo 'lồng nhau' sẽ vẫn còn nguyên vì nó thực sự nằm ở nơi khác.



5

Tóm lược.

Tôi có thể lồng kho git không?

Đúng. Tuy nhiên, theo mặc định git không theo dõi .gitthư mục của kho lưu trữ lồng nhau. Git có các tính năng được thiết kế để quản lý các kho lưu trữ lồng nhau (đọc tiếp).

Liệu có ý nghĩa gì khi git init / thêm / project_root để dễ dàng quản lý mọi thứ cục bộ hay tôi phải quản lý riêng my_project và bên thứ 3?

Có lẽ nó không có ý nghĩa vì git có các tính năng để quản lý các kho lưu trữ lồng nhau. Git được tích hợp các tính năng để quản lý các kho lưu trữ lồng nhau submodulesubtree.

Đây là một blog về chủ đề này và đây là một câu hỏi SO bao gồm những ưu và nhược điểm của việc sử dụng mỗi.


2

Tôi sẽ sử dụng một kho lưu trữ cho mỗi dự án. Bằng cách đó, lịch sử trở nên dễ dàng hơn để duyệt qua.

Tôi cũng sẽ kiểm tra phiên bản của thư viện bên thứ ba mà tôi đang sử dụng, vào kho lưu trữ của dự án bằng cách sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.