2010-07-26 16 views
5

Khi sử dụng git fetch để tìm nạp thông tin từ một kho lưu trữ (rất lớn) đến kho lưu trữ khác trên máy cục bộ, git upload-pack mất nhiều thời gian để tạo các tệp gói. Trong trường hợp cục bộ, không cần phải giảm thiểu lượng dữ liệu được vận chuyển, và tôi không quan tâm đến dung lượng đĩa bị mất do mất nén delta, vì vậy lý tưởng tôi muốn các đối tượng bị thiếu được sao chép hơn là đóng gói và sau đó đã nhập. Có cách nào để yêu cầu git fetch chỉ sao chép các đối tượng bị thiếu khi sử dụng phương tiện giao thông cục bộ không?Có thể "git fetch" được yêu cầu không sử dụng "git upload-pack" cho các kho lưu trữ cục bộ không?

Hoặc, nói chung, có cách nào để ngăn chặn việc tạo các tệp gói trên toàn cầu không? Thực sự tôi chỉ muốn sử dụng git như một hệ thống tập tin được phiên bản mà không sử dụng thêm không gian cho các tệp giống hệt nhau - việc đóng gói và đóng gói lại dường như là bước tốn thời gian khiến việc này trở nên khó xử. Một cách ngẫu nhiên, tôi đã dành một chút thời gian cố gắng tối ưu hóa các tùy chọn cấu hình để quá trình đóng gói không mất quá nhiều thời gian (vì vậy tôi không nghĩ câu trả lời là "sử dụng các tùy chọn cấu hình và đóng gói này sẽ xảy ra nhiều lắm." nhanh hơn "- tuy nhiên, có lẽ tôi đã có tất cả sai, vì vậy chỉ cần rõ ràng, các tùy chọn cấu hình mà tôi thường sử dụng (trên một maching với 2 GiB RAM) là:

core.deltacachesize=1 
core.packedgitwindowsize=16m 
core.packedgitlimit=128m 
pack.packsizelimit=512m 
pack.windowmemory=200m 
pack.deltacachesize=200m 
pack.window=4 
pack.compression=3 
pack.threads=0 
gc.auto=0 
gc.pruneexpire=never 
receive.autogc=false 
+0

afaik, git sử dụng liên kết cứng khi nhân bản một kho lưu trữ cục bộ. Tôi không biết về tìm nạp mặc dù – knittl

Trả lời

0

Có thể (không được thử nghiệm) thiết lập một http-backend cho repo đầu tiên của bạn (một trong những bạn đang tìm nạp).

Đây là loại máy chủ có một thiết lập mà có thể là quan tâm trong trường hợp của bạn:

http.uploadpack 

này phục vụ git fetch-packgit ls-remote khách hàng.
Nó được kích hoạt theo mặc định, nhưng một kho lưu trữ có thể vô hiệu hóa nó bằng cách đặt mục cấu hình này thành false.

+0

Cảm ơn, VonC, nhưng không đặt http.uploadpack = false chỉ vô hiệu hóa tìm nạp từ giao thức HTTP thông minh hoàn toàn? (Đó là những gì các thử nghiệm trong t556x_common gợi ý cho tôi, anyway.) Điều đó nói rằng, tôi nghĩ rằng các hành động của giao thông HTTP câm có thể là những gì tôi muốn bắt chước nhưng như là một lựa chọn cho các phương tiện giao thông địa phương. Tôi ít nhất nên cố gắng thiết lập một máy chủ HTTP nhẹ để xem liệu sử dụng tranport câm sẽ là một cải thiện tốc độ ... –

+0

@Mark: điều đó có thể vô hiệu hóa việc vận chuyển HTTP thông minh. Nhưng ngay cả với một phương tiện giao thông địa phương đơn giản, đó là giá trị một thử. – VonC

2

lẽ bạn có thể sử dụng khuyết (thay thế lưu trữ đối tượng) cơ chế; điều này sẽ cho phép chia sẻ cơ sở dữ liệu đối tượng với kho khác cục bộ và sau đó không phải gói chúng.

Để thiết lập này, sử dụng 'git clone' bằng cách sử dụng tùy chọn --shared nếu nhân bản từ kho lưu trữ cục bộ, hoặc --reference <repository> nếu nhân bản từ kho lưu trữ từ xa nhưng khi bạn có kho tương tự tại địa phương, hoặc chỉ cần chỉnh sửa .git/objects/info/alternates file.

+0

Jakub: cảm ơn cho câu trả lời - Tôi đã sử dụng thay thế trước đây cho điều này, nhưng trong trường hợp hiện tại tôi muốn kết hợp cơ sở dữ liệu đối tượng để tôi có một kho lưu trữ độc lập. Như tôi đã hiểu, việc tạo một kho chứa xen kẽ vào một kho lưu trữ độc lập sẽ vẫn liên quan đến 'git repack' và do đó quy trình đóng gói chiều dài. –

1

Tôi có một kho lưu trữ mà đồng bằng cũ git clone sẽ không sao chép:

$ git clone $url 
Cloning into foo... 
remote: Counting objects: 6142, done. 
error: pack-objects died of signal 9839/6058) 
error: git upload-pack: git-pack-objects died with error. 
fatal: git upload-pack: aborting due to possible repository corruption on the remote side. 
remote: aborting due to possible repository corruption on the remote side. 
fatal: early EOF 
fatal: index-pack failed 

Mặc dù nó che dấu bởi các văn bản tiến bộ mà nó ghi đè lên, thông báo lỗi thất bại là error: pack-objects died of signal 9.

Tôi đã có thể ngăn chặn lỗi bằng cách tắt đóng gói ở phía máy khách. Tôi đã làm điều này bằng cách phát hành một chuỗi lệnh (được phát hành với git 1.7.4.1) về cơ bản làm những gì git clone thực hiện, nhưng với lệnh bổ sung để đặt pack.depth thành 0 trước khi chạy git fetch.

mkdir foo 
cd foo 
git init 
git remote add origin $url 
git config pack.depth 0 
git fetch origin 
git branch --set-upstream origin origin/master 
git checkout master 
+0

Cảm ơn đề nghị, đặc biệt là câu hỏi hiện nay là cổ đại trong S.O. điều khoản :) Tôi sẽ thử điều đó sớm. –

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