Bắt đầu với phiên bản Git 2.5+ (quý 2 năm 2015), việc tìm nạp một cam kết duy nhất (không nhân bản toàn bộ repo) là thực sự có thể.
Xem cam kết 68ee628 của Fredrik Medley ( moroten
) , ngày 21 tháng 5 năm 2015.
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết a9d3493 , ngày 01 tháng 6 năm 2015)
Bây giờ bạn có một cấu hình mới (về phía máy chủ)
uploadpack.allowReachableSHA1InWant
Cho phép upload-pack
chấp nhận yêu cầu tìm nạp yêu cầu một đối tượng có thể truy cập từ bất kỳ mẹo tham chiếu nào. Tuy nhiên, lưu ý rằng tính toán khả năng tiếp cận đối tượng là tính toán tốn kém.
Mặc định cho false
.
Nếu bạn kết hợp cấu hình phía máy chủ đó với bản sao nông ( git fetch --depth=1
), bạn có thể yêu cầu một cam kết duy nhất (xem t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Bạn có thể sử dụng git cat-file
lệnh để thấy rằng cam kết đã được tìm nạp:
git cat-file commit $SHA1
" git upload-pack
" phục vụ " git fetch
" có thể được yêu cầu phục vụ các cam kết không nằm trong đầu của bất kỳ ref nào, miễn là chúng có thể truy cập được từ một ref, với uploadpack.allowReachableSHA1InWant
biến cấu hình.
Tài liệu đầy đủ là:
upload-pack
: tùy chọn cho phép tìm nạp sha1 có thể truy cập
Với uploadpack.allowReachableSHA1InWant
tùy chọn cấu hình được đặt ở phía máy chủ, " git fetch
" có thể đưa ra yêu cầu với dòng "muốn" đặt tên cho một đối tượng chưa được quảng cáo (có thể đã được lấy ra khỏi băng tần hoặc từ một con trỏ mô hình con).
Chỉ các đối tượng có thể truy cập từ các mẹo nhánh, tức là sự kết hợp của các nhánh và nhánh được quảng cáo ẩn bởi transfer.hideRefs
, sẽ được xử lý.
Lưu ý rằng có một chi phí liên quan đến việc phải quay lại lịch sử để kiểm tra khả năng tiếp cận.
Tính năng này có thể được sử dụng khi có được nội dung của một cam kết nhất định, mà sha1 được biết đến, mà không cần phải sao chép toàn bộ kho lưu trữ, đặc biệt nếu sử dụng tìm nạp nông .
Trường hợp hữu ích là ví dụ
- kho chứa các tệp lớn trong lịch sử,
- chỉ tìm nạp dữ liệu cần thiết cho kiểm tra mô hình con,
- khi chia sẻ sha1 mà không cho biết chính xác nó thuộc về nhánh nào và trong Gerrit, nếu bạn nghĩ về các cam kết thay vì thay đổi số.
(Trường hợp Gerrit đã được giải quyết thông qua allowTipSHA1InWant
vì mọi thay đổi của Gerrit đều có tham chiếu.)
Git 2.6 (quý 3 năm 2015) sẽ cải thiện mô hình đó.
Xem cam kết 2bc31d1 , cam kết cc118a6 (28 tháng 7 năm 2015) của Jeff King ( peff
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 824a0be , ngày 19 tháng 8 năm 2015)
refs
: hỗ trợ tiêu cực transfer.hideRefs
Nếu bạn ẩn một hệ thống phân cấp của ref bằng cách sử dụng transfer.hideRefs
cấu hình, không có cách nào để ghi đè cấu hình đó để "bỏ ẩn" nó.
Bản vá này thực hiện ẩn "tiêu cực" khiến các trận đấu ngay lập tức được đánh dấu là không bị cấm, ngay cả khi một trận đấu khác sẽ ẩn nó.
Chúng tôi cẩn thận áp dụng các trận đấu theo thứ tự ngược từ cách chúng được cung cấp cho chúng tôi bởi máy cấu hình, vì điều đó cho phép cấu hình ưu tiên "lần cuối cùng thắng" thông thường của chúng tôi ( .git/config
ví dụ: các mục trong sẽ ghi đè lên /etc/gitconfig
).
Vì vậy, bây giờ bạn có thể làm:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
để ẩn refs/secret
trong tất cả các repos, ngoại trừ một bit công khai trong một repo cụ thể.
Git 2.7 (tháng 11/12/2015) sẽ cải thiện trở lại:
Xem cam kết 948bfa2 , cam kết 00b293e (5 tháng 11 năm 2015), cam kết 78a766a , cam kết 92cab49 , cam kết 92cab49 , cam kết 92cab49 (3 tháng 11 năm 2015), cam kết 00b293e , cam kết 00b293e (5 tháng 11 năm 2015), và cam kết 92cab49 , cam kết 92cab49 , cam kết 92cab49 , cam kết 92cab49 (03 tháng 11 năm 2015) bởi Lukas Fleischer ( lfos
) .
Được giúp đỡ: Eric Sunshine ( sunshineco
) .
(Được hợp nhất bởi Jeff King - peff
- trong bản cam kết dbba85e , ngày 20 tháng 11 năm 2015)
config.txt
: ghi lại ngữ nghĩa của hideRefs
với không gian tên
Ngay bây giờ, không có định nghĩa rõ ràng về cách transfer.hideRefs
ứng xử khi không gian tên được đặt.
Giải thích rằng hideRefs
tiền tố khớp với tên bị tước trong trường hợp đó. Đây là cách hideRefs
các mẫu hiện đang được xử lý trong gói nhận.
hideRefs: thêm hỗ trợ để phù hợp với giới thiệu đầy đủ
Ngoài việc so sánh các tham chiếu bị tước, giờ đây người ta có thể thêm hideRefs
các mẫu mà tham chiếu đầy đủ (chưa được xử lý) được khớp với.
Để phân biệt giữa khớp bị tước và khớp hoàn toàn, các mẫu mới đó phải được thêm tiền tố với dấu mũ ( ^
).
Do đó tài liệu mới :
transfer.hideRefs:
Nếu một không gian tên được sử dụng, tiền tố không gian tên bị tước khỏi mỗi tham chiếu trước khi nó được khớp với transfer.hiderefs
các mẫu.
Ví dụ, nếu refs/heads/master
được quy định trong transfer.hideRefs
và không gian tên hiện tại foo
, sau đó refs/namespaces/foo/refs/heads/master
được bỏ qua từ quảng cáo nhưng refs/heads/master
và
refs/namespaces/bar/refs/heads/master
vẫn đang được quảng cáo như cái gọi là "có" dòng.
Để khớp với ref trước khi tước, hãy thêm ^
vào trước tên ref. Nếu bạn kết hợp !
và ^
, !
phải được chỉ định đầu tiên.
R .. đề cập trong các ý kiến cấu hình uploadpack.allowAnySHA1InWant
, cho phép upload-pack
chấp nhận một fetch
yêu cầu yêu cầu bất kỳ đối tượng nào. (Mặc định là false
).
Xem cam kết f8edeaa (tháng 11 năm 2016, Git v2.11.1) của David "novalis" Turner ( novalis
) :
upload-pack
: tùy chọn cho phép tìm nạp bất kỳ sha1
Có vẻ hơi ngớ ngẩn khi thực hiện kiểm tra khả năng tiếp cận trong trường hợp chúng tôi tin tưởng người dùng truy cập hoàn toàn mọi thứ trong kho lưu trữ.
Ngoài ra, nó không phù hợp trong một hệ thống phân tán - có lẽ một máy chủ quảng cáo một ref, nhưng một máy chủ khác đã bị ép buộc với ref đó, và có lẽ hai yêu cầu HTTP cuối cùng được chuyển đến các máy chủ khác nhau này.