Mới trong git1.8.4 sắp tới (tháng 7 năm 2013) :
" git submodule update
" Có thể tùy ý sao chép các kho lưu trữ mô đun con một cách nông cạn.
(Và git 2.10 Q3 2016 cho phép ghi lại điều đó với git config -f .gitmodules submodule.<name>.shallow true
.
Xem phần cuối của câu trả lời này)
Xem cam kết 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
Thêm --depth
tùy chọn vào các lệnh thêm và cập nhật của "git subodule", sau đó được chuyển sang lệnh clone. Điều này hữu ích khi (các) mô hình con rất lớn và bạn không thực sự quan tâm đến bất cứ điều gì ngoại trừ cam kết mới nhất.
Các thử nghiệm được thêm vào và một số điều chỉnh chú ý đã được thực hiện để phù hợp với phần còn lại của testfile về "cập nhật mô hình con có thể xử lý các liên kết tượng trưng trong pwd".
Đã ký tắt: Fredrik Gustafsson <iveqy@iveqy.com>
Acked-by: Jens Lehmann<Jens.Lehmann@web.de>
Điều đó có nghĩa là điều này hoạt động:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
Với:
--depth::
Tùy chọn này là hợp lệ cho add
và update
các lệnh.
Tạo một bản sao 'nông' với một lịch sử được cắt ngắn theo số lần sửa đổi được chỉ định.
atwyman thêm vào trong các ý kiến :
Theo như tôi có thể nói tùy chọn này không thể sử dụng được cho các mô hình con không theo dõi master
rất chặt chẽ. Nếu bạn đặt độ sâu 1, thì submodule update
chỉ có thể thành công nếu mô hình con cam kết bạn muốn là chủ mới nhất. Nếu không, bạn nhận được " fatal: reference is not a tree
" .
Điều đó đúng.
Đó là, cho đến git 2.8 (tháng 3 năm 2016). Với 2.8, submodule update --depth
có thêm một cơ hội để thành công, ngay cả khi SHA1 có thể truy cập trực tiếp từ một trong các ĐẦU repo từ xa.
Xem cam kết fb43e31 (24 tháng 2 năm 2016) của Stefan Beller ( stefanbeller
) .
Giúp đỡ: Junio C Hamano ( gitster
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 9671a76 , ngày 26 tháng 2 năm 2016)
mô hình con: cố gắng hơn để tìm nạp sha1 cần thiết bằng cách tìm nạp trực tiếp sha1
Khi xem xét một thay đổi cũng cập nhật một mô hình con trong Gerrit, một thực tiễn đánh giá phổ biến là tải xuống và chọn bản vá cục bộ để kiểm tra nó.
Tuy nhiên, khi kiểm tra nó cục bộ, ' git submodule update
' có thể không tìm nạp được mô hình con chính xác sha1 vì cam kết tương ứng trong mô hình con chưa phải là một phần của lịch sử dự án, mà chỉ là một thay đổi được đề xuất.
Nếu $sha1
không phải là một phần của tìm nạp mặc định, chúng tôi sẽ cố gắng tìm nạp $sha1
trực tiếp . Tuy nhiên, một số máy chủ không hỗ trợ tìm nạp trực tiếp bởi sha1, dẫn git-fetch
đến lỗi nhanh chóng.
Chúng ta có thể thất bại ở đây vì sha1 vẫn còn thiếu sẽ dẫn đến thất bại sau này trong giai đoạn thanh toán, vì vậy thất bại ở đây là tốt như chúng ta có thể nhận được.
MVG chỉ ra trong các ý kiến để cam kết fb43e31 (git 2.9, tháng 2 năm 2016)
Dường như với tôi rằng cam kết fb43e31 yêu cầu cam kết bị thiếu bởi id SHA1, vì vậy uploadpack.allowReachableSHA1InWant
và uploadpack.allowTipSHA1InWant
các cài đặt trên máy chủ có thể sẽ ảnh hưởng đến việc này có hoạt động hay không.
Tôi đã viết một bài đăng lên danh sách git ngày hôm nay , chỉ ra cách sử dụng các mô đun con nông có thể được thực hiện để hoạt động tốt hơn cho một số tình huống, cụ thể là nếu cam kết cũng là một thẻ.
Hãy chờ xem.
Tôi đoán đây là một lý do tại sao fb43e31 làm cho việc tìm nạp cho một SHA1 cụ thể trở thành dự phòng sau khi tìm nạp cho nhánh mặc định.
Tuy nhiên, trong trường hợp của Lv tìm nạp bất cứ thứ gì, vì chúng tôi sẽ không thể đáp ứng yêu cầu mô hình con theo bất kỳ cách nào.
Cập nhật tháng 8 năm 2016 (3 năm sau)
Với Git 2.10 (quý 3 năm 2016), bạn sẽ có thể làm
git config -f .gitmodules submodule.<name>.shallow true
Xem " Mô hình con Git không có trọng lượng thêm " để biết thêm.
Git 2.13 (quý 2 năm 2017) thêm vào cam kết 8d3047c (ngày 19 tháng 4 năm 2017) bởi Sebastian Schuberth ( sschuberth
) .
(Được hợp nhất bởi Sebastian Schuberth - sschuberth
- trong cam kết 8d3047c , ngày 20 tháng 4 năm 2017)
một bản sao của mô hình con này sẽ được thực hiện dưới dạng bản sao nông (với độ sâu lịch sử là 1)
Tuy nhiên, Ciro Santilli thêm vào các bình luận (và chi tiết trong câu trả lời của ông )
shallow = true
bật .gitmodules
chỉ ảnh hưởng đến tham chiếu được theo dõi bởi ĐẦU của điều khiển từ xa khi sử dụng --recurse-submodules
, ngay cả khi cam kết đích được chỉ ra bởi một nhánh và ngay cả khi bạn cũng đặt branch = mybranch
trên đó .gitmodules
.
Git 2.20 (Q4 2018) cải thiện về hỗ trợ mô hình con, đã được cập nhật để đọc từ blob tại HEAD:.gitmodules
thời điểm .gitmodules
thiếu tệp từ cây làm việc.
Xem cam kết 2b1257e , cam kết 76e9bdc (ngày 25 Tháng 10 năm 2018), và cam kết b5c259f , cam kết 23dd8f5 , cam kết b2faad4 , cam kết 2502ffc , cam kết 996df4d , cam kết d1b13df , cam kết 45f5ef3 , cam kết bcbc780 (05 Tháng 10 năm 2018) bởi Antonio Ospite ( ao2
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết abb4824 , ngày 13 tháng 11 năm 2018)
submodule
: hỗ trợ đọc .gitmodules
khi nó không ở trong cây làm việc
Khi .gitmodules
tệp không có sẵn trong cây làm việc, hãy thử sử dụng nội dung từ chỉ mục và từ nhánh hiện tại.
Điều này bao gồm trường hợp khi tệp là một phần của kho lưu trữ nhưng vì một số lý do, nó không được kiểm tra, ví dụ vì thanh toán thưa thớt.
Điều này làm cho nó có thể sử dụng ít nhất là ' git submodule
' lệnh mà đọc các gitmodules
tập tin cấu hình mà không Populating đầy đủ các cây làm việc.
Viết thư .gitmodules
vẫn sẽ yêu cầu kiểm tra tệp, vì vậy hãy kiểm tra trước khi gọi config_set_in_gitmodules_file_gently
.
Thêm một kiểm tra tương tự cũng git-submodule.sh::cmd_add()
để dự đoán sự thất bại cuối cùng của git submodule add
lệnh "" khi .gitmodules
không thể ghi an toàn; điều này ngăn lệnh rời khỏi kho lưu trữ ở trạng thái giả (ví dụ: kho lưu trữ mô hình con được sao chép nhưng .gitmodules
không được cập nhật vì config_set_in_gitmodules_file_gently
không thành công).
Hơn nữa, vì config_from_gitmodules()
bây giờ truy cập vào kho đối tượng toàn cầu, cần phải bảo vệ tất cả các đường dẫn mã gọi hàm chống lại truy cập đồng thời vào kho đối tượng toàn cầu.
Hiện tại điều này chỉ xảy ra builtin/grep.c::grep_submodules()
, vì vậy hãy gọi
grep_read_lock()
trước khi gọi mã liên quan config_from_gitmodules()
.
LƯU Ý: có một trường hợp hiếm hoi khi tính năng mới này chưa hoạt động đúng: các mô đun con lồng nhau mà không có .gitmodules
trong cây làm việc của chúng.
Lưu ý: Git 2.24 (Q4 2019) sửa lỗi segfault có thể xảy ra khi nhân bản mô đun con nông.
Xem cam kết ddb3c85 (30 tháng 9 năm 2019) của Ali Utku Selen ( auselen
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 678a9ca , ngày 09 tháng 10 năm 2019)
Git 2.25 (Q1 2020), làm rõ git submodule update
tài liệu.
Xem cam kết f0e58b3 (24 tháng 11 năm 2019) của Philippe Blain ( phil-blain
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết ef61045 , ngày 5 tháng 12 năm 2019)
doc
: đề cập rằng 'git subodule update' tìm nạp các xác nhận bị thiếu
Được giúp đỡ: Junio C Hamano
Được giúp đỡ: Julian Schindelin
Đã ký tắt: Philippe Blain
' git submodule
Cập nhật' sẽ tìm nạp các xác nhận mới từ điều khiển mô hình con nếu không tìm thấy SHA-1 được ghi trong siêu dự án . Điều này đã không được đề cập trong tài liệu.
Cảnh báo: Với Git 2.25 (Q1 2020), sự tương tác giữa " git clone --recurse-submodules
" và kho đối tượng thay thế được thiết kế không phù hợp.
Các tài liệu và mã đã được dạy để đưa ra các khuyến nghị rõ ràng hơn khi người dùng thấy thất bại.
Xem cam kết 4f3e57e , cam kết 10c64a0 (02 tháng 12 năm 2019) của Jonathan Tan ( jhowtan
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 5dd1d59 , ngày 10 tháng 12 năm 2019)
submodule--helper
: tư vấn về lỗi thay thế gây tử vong
Đã ký: Jonathan Tan
Acked-by: Jeff King
Khi nhân bản đệ quy một siêu dự án với một số mô-đun nông được xác định trong nó .gitmodules
, sau đó lặp lại với " --reference=<path>
", một lỗi xảy ra. Ví dụ:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
thất bại với:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
Khi không thể thêm một thay thế được tính toán từ thay thế của siêu dự án, dù trong trường hợp này hay trường hợp khác, hãy khuyên về cách định submodule.alternateErrorStrategy
cấu hình tùy chọn cấu hình "" và sử dụng " --reference-if-able
" thay vì " --reference
" khi nhân bản.
Đó là chi tiết trong:
Với Git 2.25 (Q1 2020), sự tương tác giữa "git clone --recurse-subodules" và kho đối tượng thay thế được thiết kế không phù hợp.
Doc
: giải thích mô đun con.alternateErrorStrargety
Đã ký: Jonathan Tan
Acked-by: Jeff King
Cam kết 31224cbdc7 (" clone
: tùy chọn đệ quy và tham chiếu kích hoạt thay thế mô hình con", 2016-08-17, Git v2.11.0-rc0 - hợp nhất được liệt kê trong lô # 1 ) đã dạy Git để hỗ trợ các tùy chọn cấu hình " submodule.alternateLocation
" và " submodule.alternateErrorStrategy
" trên siêu dự án .
Nếu " submodule.alternateLocation
" được cấu hình thành " superproject
" trên siêu dự án, bất cứ khi nào một mô hình con của siêu dự án đó được sao chép, thay vào đó, nó sẽ tính toán đường dẫn thay thế tương tự cho mô hình con đó từ $GIT_DIR/objects/info/alternates
siêu dự án và tham chiếu nó.
Các " submodule.alternateErrorStrategy
" tùy chọn xác định những gì sẽ xảy ra nếu thay thế mà không thể được tham chiếu.
Tuy nhiên, không rõ ràng rằng bản sao tiến hành như thể không có sự thay thế nào được chỉ định khi tùy chọn đó không được đặt thành "chết" (như có thể thấy trong các thử nghiệm trong 31224cbdc7 ).
Do đó, tài liệu cho phù hợp.
Các tài liệu hướng dẫn cấu hình submodule hiện nay bao gồm:
submodule.alternateErrorStrategy::
Chỉ định cách xử lý lỗi với các thay thế cho một mô hình con như được tính toán thông qua submodule.alternateLocation
.
Giá trị có thể là ignore
, info
, die
.
Mặc định là die
.
Lưu ý rằng nếu được đặt thành ignore
hoặc info
và nếu có lỗi với thay thế được tính toán, bản sao sẽ tiến hành như thể không có thay thế nào được chỉ định .
git submodule add/update
" bây giờ có thể sao chép các kho lưu trữ mô đun con một cách nông cạn! Xem câu trả lời của tôi dưới đây