2015-08-07 17 views
18

Gần đây tôi phát hiện ra git worktree lệnh:gì trục trặc khi sử dụng git worktree với submodules git

Các thư mục làm việc mới được liên kết với các kho lưu trữ hiện hành, chia sẻ tất cả mọi thứ ngoại trừ thư mục làm việc các file cụ thể như HEAD, chỉ số, vv

Nhưng các tài liệu cũng cho thấy

... sự hỗ trợ cho các môđun con là không đầy đủ. KHÔNG được khuyến khích thực hiện nhiều lần kiểm tra siêu dự án.

mà không giải thích thêm về những gì xảy ra sai.

Ai đó có thể khai sáng cho tôi về các vấn đề mong đợi không? Ví dụ, tôi sẽ ổn nếu tôi sử dụng các worktrees riêng biệt được tạo theo cách này chỉ cho những thay đổi không ảnh hưởng đến các mô-đun con?

Trả lời

13

Commit a83a66a là khá rõ ràng về điều đó:

git-submodule.sh hy vọng $GIT_DIR/config là mỗi worktree, ít nhất là trong submodule.* part.
Ở đây tôi nghĩ rằng chúng tôi có hai lựa chọn:

  • hoặc cập nhật config.c để cũng đọc $GIT_DIR/config.worktree (đó là mỗi worktree) ngoài $GIT_DIR/config (chia sẻ) và lưu trữ vars worktree cụ thể trong nơi ở mới,
  • hoặc cập nhật git-submodule.sh để đọc/ghi submodule.* trực tiếp từ $GIT_DIR/config.submodule (mỗi worktree).

Mất thời gian này để giải quyết chính xác. Trong khi đó, tạo ghi chú cho người dùng rằng họ không nên sử dụng nhiều worktrees trong ngữ cảnh submodule.

Thông thường, nơi đặt các mô-đun con đó?

Có một vài lựa chọn:

  • Bạn có thể muốn giữ $SUB Repos nơi khác (có lẽ trong một vị trí trung tâm) bên ngoài $SUPER. Điều này cũng đúng đối với các mô-đun con lồng nhau trong đó một siêu dự án có thể là môđun con của một siêu dự án khác.
  • Bạn có thể muốn giữ tất cả $SUB Repos trong $SUPER/modules (hoặc một số nơi khác trong $SUPER)
  • Chúng tôi thậm chí có thể đẩy nó xa hơn và hợp nhất tất cả $SUB Repos vào $SUPER thay vì lưu trữ chúng riêng rẽ. Nhưng điều đó ít nhất sẽ yêu cầu kích hoạt tên miền ref ref.

Cam kết này là câu trả lời cho commit df56607.


Từ quan điểm người sử dụng git của xem, đó có nghĩa là một git submodule update --init --recursive không biết chính xác nơi để kiểm tra các môđun con.
Họ có bị trùng lặp trên tất cả các worktrees hay họ tập trung ở đâu đó? Điều này chưa được chỉ định chính thức.


Một năm sau (và với git 2.9), clacke thêm in the comments

sự nhầm lẫn đã được giải quyết, nhưng không phải trong một cách tối ưu.
Submodules hoạt động tốt ngay bây giờ, nhưng mỗi worktree có tập hợp riêng của repo submodule (dưới motherrepo.git/worktree/<worktreename>/modules/<submodule>), vì vậy nếu bạn có một submodule lớn, bạn đang phải đối mặt với một số sử dụng đĩa nghiêm trọng.


Git bí danh để xử lý submodules trong subtrees:

Các bí danh git wtas hy vọng rằng git wta được định nghĩa toàn cầu, hoặc ít le ast cho tất cả các repos liên quan. Không bao gồm bảo hành. Thú cưng yêu thích của bạn có thể bị nhiễm trùng nếu tên đường dẫn của bạn có dấu cách trong đó.

Nó hy vọng một cấu trúc trong repo của bạn giống như một repo không trần với submodules bắt đầu, vì vậy nếu bạn có một repo trần, bạn sẽ phải bắt chước thiết lập đó. Một mô-đun con có tên (không phải đường dẫn) foo đi theo số <your-.git-directory>/modules/foo (không phải .../foo.git). Nó sẽ không sụp đổ nếu một số module không có trong repo, nó chỉ bỏ qua nó.

Có chỗ để cải thiện. Nó không xử lý submodules trong submodules, nó chỉ đi xuống một cấp. Nó có thể chỉ hoạt động để thay đổi submodule git wta gọi đến số git wtas cuộc gọi, nhưng tôi chưa xác minh điều này.

- clacke

+1

Cảm ơn bạn đã nghiên cứu! Nhưng tôi vẫn không chắc chắn về những gì thực sự phá vỡ, và những hành động sẽ làm việc tuy nhiên. Bạn có thể cố gắng mô tả rằng từ quan điểm của người dùng git? –

+0

@JoachimBreitner từ một người dùng git, bạn không biết submodule ở đâu khi bạn thực hiện cập nhật submodule 'git --init --- recursive'. Họ được nhân đôi trên tất cả các worktrees, hay họ tập trung ở đâu đó? – VonC

+1

Tính đến hôm nay, tôi có câu hỏi này bởi vì sự nhầm lẫn đã được giải quyết, nhưng không theo cách tối ưu. Submodules làm việc tốt ngay bây giờ theo như tôi thấy, nhưng mỗi worktree có bộ repo submodule riêng của nó (dưới 'motherrepo.git/worktree//modules/'), vì vậy nếu bạn có một submodule lớn, bạn đang đối mặt với việc sử dụng đĩa nghiêm trọng. – clacke

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