Sự khác nhau giữa mô hình con git và cây con


300

Sự khác biệt về khái niệm giữa việc sử dụng mô hình con git và cây con là gì?

Các kịch bản điển hình cho mỗi là gì?


3
Điều này có thể không trả lời tất cả các câu hỏi của bạn nhưng rất thú vị khi đọc về chủ đề này: blog.atlassian.com/2013/05/ trên
Chop

Câu hỏi tương tự là stackoverflow.com/questions/571232/
Mạnh

"Lựa chọn thay thế để Git submodules?": Stackoverflow.com/questions/6500524/...
brillout

Câu trả lời:


177

Điều gì sẽ xảy ra nếu tôi muốn các liên kết luôn luôn trỏ đến TRƯỚC của repo bên ngoài?

Bạn có thể tạo một mô hình con để đi theo ĐẦU của một nhánh của repo từ xa mô đun con, với:

o git submodule add -b <branch> <repository> [<path>]. (để chỉ định một nhánh để theo dõi)
o git submodule update --remotesẽ cập nhật nội dung của mô hình con lên TRÊN mới nhất từ <repository>/<branch>, theo mặc định origin/master. Dự án chính của bạn vẫn sẽ theo dõi các giá trị băm của phần đầu của mô hình con ngay cả khi --remoteđược sử dụng.



câu trả lời của bạn dường như đi ngược lại với câu trả lời được bình chọn ở đây: stackoverflow.com/questions/10443627/iêu
Nathan H

@NathanH này (khả năng theo dõi CHÍNH) đã được thêm một năm sau đó (tháng 3 năm 2013, git 1.8.2: github.com/git/git/blob/ọ )
VonC

Tôi thấy hành vi theo dõi mô hình con cũng được đề cập trong anwer khác của bạn . Trong trường hợp đó, tôi nghĩ rằng bạn muốn nói rằng luôn luôn chỉ vào phần đầu của một mô hình con được thực hiện bằng cách sử dụng cả hai add -b--remotesau đó trên các lệnh cập nhật, theo tài liệu cập nhật mô hình con . Trong trường hợp đó, có -bthực sự vẫn cần thiết để theo dõi TRƯỞNG THỨC không?
matanster

@matt the -bđược sử dụng để tạo siêu dữ liệu .gitmodule đúng cho mô hình con (nó tương đương với a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC

Sau đó, nó không liên quan nhiều đến việc bật --remote- --remotecũng hoạt động nếu -bchưa được sử dụng add. Trong cả hai trường hợp, bản cập nhật sẽ gây ra một cam kết trong repo cha mẹ mô đun con, vì vậy các liên kết không thực sự "luôn luôn trỏ đến CHÍNH" theo cách rất tự động .... hoặc tôi đã không nhận được nó, hoặc yêu cầu đó tốt hơn nên được loại bỏ khỏi câu trả lời ban đầu (?)
matanster

351

mô hình con là liên kết;

cây con là bản sao


121

Sự khác biệt về khái niệm là:

Với các mô đun con git, bạn thường muốn tách một kho lưu trữ lớn thành các kho nhỏ hơn. Cách tham chiếu một mô hình con là kiểu maven - bạn đang tham chiếu một cam kết duy nhất từ ​​kho lưu trữ (mô hình con) khác. Nếu bạn cần một thay đổi trong mô hình con, bạn phải thực hiện một cam kết / đẩy trong mô hình con, sau đó tham chiếu cam kết mới trong kho lưu trữ chính và sau đó cam kết / đẩy tham chiếu đã thay đổi của kho lưu trữ chính. Bằng cách đó, bạn phải có quyền truy cập vào cả hai kho lưu trữ để xây dựng hoàn chỉnh.

Với git cây con, bạn tích hợp một kho lưu trữ khác trong kho của bạn, bao gồm cả lịch sử của nó. Vì vậy, sau khi tích hợp nó, kích thước của kho lưu trữ của bạn có thể lớn hơn (vì vậy đây không phải là chiến lược để giữ cho kho lưu trữ nhỏ hơn). Sau khi tích hợp, không có kết nối với kho lưu trữ khác và bạn không cần truy cập vào nó trừ khi bạn muốn nhận được bản cập nhật. Vì vậy, chiến lược này là nhiều hơn cho việc sử dụng lại mã và lịch sử - cá nhân tôi không sử dụng nó.


Nhưng với git subtreebạn vẫn có thể đẩy - nếu bạn muốn - phải không?
Ixx

@lxx Nếu bạn biết kho URL URL
Franklin Yu

@FranklinYu Tại sao anh ấy không biết điều đó? không thể lấy thông tin đó từ dữ liệu meta git cục bộ?
adi518

@ adi518 Có, nếu bạn là người tạo ra cây con. Tuy nhiên, nếu bạn đã đẩy kho lưu trữ của mình lên GitHub và những người khác sao chép nó xuống, tôi không nghĩ anh ấy / cô ấy tự động biết URL phụ.
Franklin Yu

@NiklasP - bạn có thể nói rõ hơn về "tham chiếu cam kết mới trong kho lưu trữ chính" không? Đó là một bước tôi không rõ về cách thực hiện và do đó "tham chiếu thay đổi" cũng không phải là điều tôi hiểu.
Robert Oschler

21

mô-đun phụ
đẩy một repo chính đến một điều khiển từ xa không đẩy các tập tin của mô-đun phụ

cây phụ
đẩy một repo chính đến từ xa đẩy các tập tin của cây con


3
"đẩy một repo chính đến từ xa đẩy các tập tin của cây con" Không, nó không.
J Bramble

@JBramble Có lẽ tôi nên đề cập rằng nó đã được thực hiện với ứng dụng SourceTree, ví dụ:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
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.