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
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? –
@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
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