2010-11-14 26 views
23

Tôi thỉnh thoảng kết nối Internet đắt tiền và tôi muốn biết (ít nhất là xấp xỉ) lượng dữ liệu sẽ được đẩy tới điều khiển từ xa trong một số git push.Dự đoán số lượng dữ liệu sẽ được đẩy bằng git push

+1

Điều này có vẻ khó khăn ... đẩy được nén, và vì vậy để thực sự biết, bạn muốn ngắt sau khi nó được tạo ra các gói nhưng trước khi nó gửi. Bạn có thể thử kiểm tra kích thước của gói tương ứng, mặc dù điều đó có nghĩa là đóng gói hiệu quả hai lần. – Cascabel

Trả lời

25

Thực ra, tôi nghĩ tôi thích nhận xét của tôi đủ để đăng câu trả lời!

Khi bạn đẩy, git tạo một gói tất cả các đối tượng cần thiết và tải lên đối tượng từ xa. Điều này có nghĩa là chúng tôi đang tìm cách để dự đoán kích thước gói đó. Kể từ khi các gói được nén, mà làm cho nó rất khó khăn để làm bất cứ điều gì dựa trên diffs hoặc kích thước đối tượng; những gì chúng tôi thực sự muốn làm là chỉ xem gói lớn như thế nào. Nó sẽ rất tuyệt nếu bạn có thể làm gián đoạn sự thúc đẩy, ngay sau khi nó được xây dựng, và quyết định tiến hành dựa trên kích thước của gói, nhưng tôi không nghĩ điều đó là có thể. Suy đoán tốt nhất của tôi là cố gắng tạo lại gói sẽ được đẩy và kiểm tra.

Tệp bó về cơ bản là một gói có thông tin tiêu đề (xem the source nếu bạn muốn). Điều này có nghĩa đó là một lệnh sứ tiện lợi mà sẽ tạo ra một tập tin với kích thước bạn quan tâm. (Dễ dàng hơn nhiều so với cố gắng sử dụng pack-objects bằng tay.) Sử dụng một cái gì đó như thế này:

git bundle create foo.bundle ^origin/master master 

Điều đó sẽ cung cấp cho bạn một bó chứa mọi thứ cần thiết để có được để làm chủ, cho rằng điều khiển từ xa có nguồn gốc/master - giống hệt nhau điều cần được đẩy bởi git push origin master. Nếu bạn có thêm chi nhánh bạn sẽ được đẩy, bạn có thể tack chúng trên là tốt; nó chỉ lấy rev-list args:

git bundle create foo.bundle ^origin/master master ^origin/topic topic ... 

Chỉ cần kiểm tra kích thước của gói đã tạo; nó sẽ gần như tương đương với những gì bạn sẽ thúc đẩy. Điều này có nghĩa là bạn sẽ phải tạo gói hai lần (một lần với gói và một lần bằng cách đẩy), nhưng trừ khi đây là một cú đẩy thực sự lớn mất một thời gian dài để đóng gói, đó không phải là một Vấn đề lớn.

2
git diff HEAD origin/master --stat 
+0

Điều này không hiển thị băng thông, tôi nhận được: git push --dry-run -v Đẩy tới [email protected]: project Để [email protected]: project fbe6184..7b7a3bc master -> master –

+0

@ Gerald, hãy thử sử dụng lệnh git diff thay thế. Ví dụ tôi đã đăng ở trên sẽ cho bạn biết tệp nào đã thay đổi và số lượng dòng chèn và xóa trong mỗi tệp. Có đủ thông tin để đi qua không? –

+0

nó là một ước tính sơ bộ, khi nén và nhị phân khác nhau có liên quan. Cũng tẻ nhạt nếu có nhiều thay đổi. –

9

Bạn có thể tìm hiểu khá nhiều chính xác bằng cách chạy một chút tương tự như của Bash những gì Git sẽ chạy trong nội bộ khi nó tạo ra các tập tin gói để đẩy:

$ echo $(git merge-base HEAD origin/master)..HEAD | git pack-objects --revs --thin --stdout -q | wc -c 

này nên sản lượng byte-count của gói tệp Git sẽ gửi. Được chia nhỏ:

# Find the common ancestor of HEAD and origin/master, and output a 
# revision range (<a>..<b>) string to git pack-objects. 
echo $(git merge-base HEAD origin/master)..HEAD 

# Generate the pack file containing the revision range specified above, writing 
# it to stdout. 
git pack-objects --revs --thin --stdout -q 

# Print the byte count of the file contents passed via stdin. 
wc -c 

Điều này có điều kiện khi thực hiện git fetch ngay trước khi bạn đẩy; nếu không, Git sẽ không thể tìm thấy tổ tiên chung và sẽ gửi nội dung của toàn bộ kho lưu trữ của bạn. Xem this answer để biết thêm thông tin.