2009-12-09 46 views
139

Tôi có thể lồng các kho lưu trữ git không? Tôi có:Các kho lưu trữ git lồng nhau?

/project_root/ 
/project_root/my_project 
/project_root/third_party_git_repository_used_by_my_project 

Có hợp lý để git init/thêm/project_root để dễ dàng quản lý mọi thứ cục bộ hoặc tôi phải quản lý my_project và bên thứ ba riêng biệt không?

Trả lời

124

Bạn có thể đang tìm kiếm tính năng Git có tên là submodules. 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 trong kho lưu trữ chính của bạn.

+29

Là người mới bắt đầu, tôi thấy blog/hướng dẫn này dễ hiểu hơn http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/ Nó đơn giản hơn phương pháp tiếp cậ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 shell helper; Tôi thấy dễ đọc hơn. –

+2

Blog chrisjean.com dường như không tồn tại dựa trên việc cố gắng theo dõi nó. Bài viết 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 newbie git tôi thích chính xác hơn ... – sage

3

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 của 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ó.

34

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

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

Khi quyết định làm thế nào để phân đoạn một repo tôi sẽ thường quyết định dựa trên mức độ thường xuyên tôi sẽ thay đổi chúng. Nếu nó là một thư viện của bên thứ ba và chỉ những thay đổi bạn đang thực hiện cho nó là 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ó ra khỏi dự án chính.

14

git-subtree sẽ giúp bạn làm việc với nhiều dự án trong một cây duy nhất giữ lịch sử tách cho chúng.

+3

Tính năng này sau đó đã được sáp nhập vào Git. Đây là một mô tả hay: https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree – nobar

16

Chỉ cần cho đầy đủ:

Có một giải pháp khác, tôi muốn giới thiệu: subtree merging.

Ngược lại với các mô-đun con, nó dễ bảo trì hơn. Bạn sẽ tạo từng kho lưu trữ theo cách thông thường. Trong kho lưu trữ chính của bạn, bạn muốn hợp nhất chính (hoặc bất kỳ nhánh nào khác) của một 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 khác vào thư mục của bạn (để cập nhật nó), sử dụng chiến lược cây con hợp nhất:

$ git pull -s subtree OtherRepository master 

Tôi đang sử dụng phương pháp này cho 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 mô-đun phụ có thể được tìm thấy trong git howto doc này.

+0

Tham chiếu sáp nhập subtree vào sách git không còn hoạt động nữa. Hiện tại, đây có vẻ là liên kết: https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_subtree_merge – ericx

11

Bạn có thể thêm

/project_root/third_party_git_repository_used_by_my_project 

để

/project_root/.gitignore 

rằng nên ngăn chặn sự repo lồng nhau để được đưa vào repo phụ huynh, và bạn có thể làm việc với họ một cách độc lập.

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

Các vấn đề liên quan