Bạn nên sử dụng git-gc thường xuyên như thế nào?


233

Bạn nên sử dụng git-gc thường xuyên như thế nào?

Các trang hướng dẫn đơn giản nói:

Người dùng được khuyến khích chạy tác vụ này một cách thường xuyên trong mỗi kho lưu trữ để duy trì việc sử dụng không gian đĩa tốt và hiệu suất hoạt động tốt.

Có một số lệnh để có được một số lượng đối tượng để tìm hiểu xem đã đến lúc gc chưa?


Các nhiệm vụ như thế này là ứng cử viên chính cho cron (nếu bạn đang sử dụng linux) minhajuddin.com/2011/12/09/ Lời
Khaja Minhajuddin

1
Lưu ý: cài đặt gc.autodetach(Git 2.0 Q2 2014) có thể giúp chạy git gc --automà không gây khó chịu cho người dùng. thấy câu trả lời của tôi dưới đây .
VonC

Câu trả lời:


204

Nó phụ thuộc chủ yếu vào số lượng kho được sử dụng. Với một người dùng kiểm tra một lần một ngày và hoạt động chi nhánh / hợp nhất / vv mỗi tuần một lần, có lẽ bạn không cần phải chạy nó nhiều hơn một lần mỗi năm.

Với vài chục nhà phát triển làm việc trên vài chục dự án, mỗi dự án kiểm tra 2-3 lần một ngày, bạn có thể muốn chạy nó hàng đêm.

Mặc dù vậy, sẽ không hại nếu chạy nó thường xuyên hơn mức cần thiết.

Những gì tôi sẽ làm là chạy nó ngay bây giờ, sau đó một tuần để thực hiện đo lường mức độ sử dụng đĩa, chạy lại và đo lại mức độ sử dụng đĩa. Nếu nó giảm 5% kích thước, thì hãy chạy nó mỗi tuần một lần. Nếu nó giảm nhiều hơn, sau đó chạy nó thường xuyên hơn. Nếu nó giảm ít hơn, sau đó chạy nó ít thường xuyên hơn.


17
Hướng dẫn sử dụng cho biết "Một số lệnh git chạy git gc --auto sau khi thực hiện các thao tác có thể tạo ra nhiều đối tượng lỏng lẻo." Bất cứ ai cũng biết những lệnh thực sự chạy nó?
Vũ điệu Joshua

2
Một cuộc nổi loạn git lớn là một ví dụ rõ ràng, vì nhiều cam kết được viết lại vào một lịch sử mới - để lại rất nhiều cam kết cũ trong repo của bạn, một phần của nhánh hiện tại nữa
mafrosis

20
"Sẽ không hại khi chạy nó thường xuyên hơn mức cần thiết" ... Tôi không hoàn toàn đồng ý. Như Aristotle chỉ ra, các cam kết lơ lửng có thể tạo ra một cơ chế sao lưu tốt.
Jason Baker

105

Lưu ý rằng nhược điểm của việc thu gom rác là kho lưu trữ của bạn, đó là, rác được thu thập. Như tất cả chúng ta đều biết là người dùng máy tính, các tệp mà chúng ta coi là rác ngay bây giờ có thể trở nên rất có giá trị trong ba ngày trong tương lai. Việc git giữ hầu hết các mảnh vụn của nó xung quanh đã cứu được thịt xông khói của tôi nhiều lần - bằng cách duyệt tất cả các cam kết nguy hiểm, tôi đã phục hồi được nhiều công việc mà tôi đã vô tình đóng hộp.

Vì vậy, đừng có quá nhiều sự quái đản trong bản sao riêng tư của bạn. Có rất ít nhu cầu cho nó.

OTOH, giá trị của khả năng phục hồi dữ liệu là nghi vấn đối với các repos được sử dụng chủ yếu như điều khiển từ xa, ví dụ. nơi tất cả các nhà phát triển đẩy đến và / hoặc kéo từ đó. Ở đó, có thể hợp lý để khởi động một cuộc chạy GC và đóng gói lại thường xuyên.


38
FWIW không phải tất cả các đối tượng lỏng lẻo đều là rác được thu thập, chỉ những đối tượng cũ hơn 2 tuần theo mặc định ( git gc --helpcụ thể là --prunetùy chọn). Ngoài ra còn có đề cập đến gc.reflogExpire, điều này khiến tôi tin rằng bất kỳ cam kết nào bạn đã truy cập trong 90 ngày qua sẽ không được thu thập. (Phiên bản Mỹ git: v1.7.6)
RobM

30

Các phiên bản gần đây của git chạy gc tự động khi được yêu cầu, vì vậy bạn không cần phải làm gì cả. Xem phần Tùy chọn của man git-gc (1) : "Một số lệnh git chạy git gc --auto sau khi thực hiện các thao tác có thể tạo ra nhiều đối tượng lỏng lẻo."


13
Tôi mới chạy nó lần đầu tiên trên một kho lưu trữ vài năm tuổi và .git của tôi đã tăng từ 16M xuống còn 2.9M, giảm 82% kích thước. Do đó, nó vẫn có vẻ hữu ích để chạy lệnh thủ công.
Darshan Rivka Whittle

@DarshanRivkaWhittle bạn đã cập nhật git trong vài năm chưa?
std''OrgnlDave

1
@ std''OrgnlDave Vâng, tôi luôn chạy bất kỳ phiên bản nào hiện có trên Arch. Tôi chỉ chạy lại nó, có thể là lần đầu tiên kể từ bình luận cuối cùng của tôi (nhờ bình luận của bạn nhắc nhở tôi) và .git của tôi đã tăng từ 81M lên 13M. Tôi không được chạy bất kỳ lệnh nào chạy gc --auto, tôi đoán vậy.
Darshan Rivka Whittle

18

Nếu bạn đang sử dụng Git-Gui , nó sẽ cho bạn biết khi nào bạn nên lo lắng:

This repository currently has approximately 1500 loose objects.

Lệnh sau sẽ mang lại một số tương tự:

$ git count-objects

Ngoại trừ, từ nguồn của nó , git-gui sẽ tự mình làm toán, thực sự đếm thứ gì đó trong .git/objectsthư mục và có thể mang lại một xấp xỉ (tôi không biết tclđọc chính xác điều đó!).

Trong mọi trường hợp, nó dường như đưa ra cảnh báo dựa trên một số tùy ý khoảng 300 đối tượng lỏng lẻo.


Quả thực nó cảnh báo, nhưng khi để nó chạy gc, phần lớn thời gian gc sẽ không làm gì cả. Vì vậy, dựa vào git gui để làm điều đó, là chờ hơn 6000 đối tượng lỏng lẻo mà luôn phải nhấp vào hoặc chạy gc và đợi trong một phút hoặc hủy: / Có lẽ ai đó nên sửa git gui theo cách mà nó kiểm tra tối đa đếm đối tượng và không bận tâm để hiển thị hộp thoại cho đến khi số lượng đạt đến giới hạn.
mlatu

Có @mlatu tôi đồng ý. Khi tôi viết điều này tôi chỉ muốn gây chú ý cho nó. Cả hai Git-Guicount-objectskhông phải là câu trả lời chính xác cho câu hỏi ở đây ... Nhưng chúng nên như vậy!
cregox

tôi không có ý rằng đây là một câu trả lời tồi, chỉ muốn chỉ ra rằng hầu hết thời gian git gui không làm gì cả. mặc dù tôi cho rằng git gc cũng không làm được gì nhiều, ngoại trừ khi có đủ việc để làm hoặc bạn đã sử dụng công tắc tích cực.
mlatu

7

Thả nó trong một công việc định kỳ chạy mỗi đêm (buổi chiều?) Khi bạn đang ngủ.


7

Tôi sử dụng git gc sau khi tôi thực hiện một kiểm tra lớn, và có rất nhiều đối tượng mới. nó có thể tiết kiệm không gian. Ví dụ: nếu bạn kiểm tra một dự án SVN lớn bằng git-svn và thực hiện git gc, bạn thường tiết kiệm được nhiều dung lượng


Điều này có còn đúng không? Ngay cả trong '08 không gian ổ cứng cũng rẻ, sử dụng nó như một sự biện minh để chạy nó dường như là vô nghĩa
Thymine

7

Bạn có thể làm điều đó mà không bị gián đoạn, với cài đặt mới (Git 2.0 Q2 2014) gc.autodetach.

Xem cam kết 4c4ac4dcam kết 9f673f9 ( Nguyễn Thái Ngọc Duy, còn gọi là pclouds ):

gc --automất thời gian và có thể chặn người dùng tạm thời (nhưng không khó chịu chút nào).
Làm cho nó chạy trong nền trên các hệ thống hỗ trợ nó.
Điều duy nhất bị mất khi chạy trong nền là bản in. Nhưng gc outputnó không thực sự thú vị.
Bạn có thể giữ nó ở phía trước bằng cách thay đổi gc.autodetach.


Kể từ phiên bản 2.0 đó, đã có một lỗi: git 2.7 (Q4 2015) sẽ đảm bảo không làm mất thông báo lỗi .
Xem cam kết 329e6e8 (ngày 19 tháng 9 năm 2015) của Nguyễn Thái Ngọc Duy ( pclouds) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 076c827 , ngày 15 tháng 10 năm 2015)

gc: lưu nhật ký từ daemonized gc --autovà in nó lần sau

Trong khi cam kết 9f673f9 ( gc: tùy chọn cấu hình để chạy --autotrong nền - 2014 / 02-08 ) giúp giảm một số khiếu nại về ' gc --auto' ăn cắp thiết bị đầu cuối, nó tạo ra một loạt vấn đề khác.

Cái mới nhất trong bộ này là, do kết quả của daemonizing, stderrđã bị đóng và tất cả các cảnh báo đều bị mất. Cảnh báo này ở cuối cmd_gc()đặc biệt quan trọng vì nó cho người dùng biết cách tránh " gc --auto" chạy liên tục.
Vì stderr bị đóng, người dùng không biết, tự nhiên họ phàn nàn về việc ' gc --auto' lãng phí CPU.

Daemonized gcbây giờ tiết kiệm stderrđến $GIT_DIR/gc.log.
Sau đây gc --autosẽ không chạy và gc.login ra cho đến khi người dùng loại bỏgc.log
.


6

Trích dẫn này được lấy từ; Kiểm soát phiên bản với Git

Git chạy bộ sưu tập rác tự động :

• Nếu có quá nhiều đối tượng lỏng lẻo trong kho lưu trữ

• Khi đẩy đến một kho lưu trữ từ xa xảy ra

• Sau một số lệnh có thể giới thiệu nhiều đối tượng lỏng lẻo

• Khi một số lệnh như git reflog hết hạn yêu cầu rõ ràng

Và cuối cùng, bộ sưu tập rác xảy ra khi bạn yêu cầu rõ ràng bằng cách sử dụng lệnh git gc. Nhưng khi nào thì nên? Không có câu trả lời chắc chắn cho câu hỏi này, nhưng có một số lời khuyên tốt và thực hành tốt nhất.

Bạn nên xem xét việc chạy git gc bằng tay trong một vài tình huống:

• Nếu bạn vừa hoàn thành một nhánh lọc git. Hãy nhớ lại rằng nhánh lọc viết lại nhiều cam kết, giới thiệu những cái mới và để lại những cái cũ trên một tham chiếu cần được loại bỏ khi bạn hài lòng với kết quả. Tất cả những đối tượng đã chết (không còn được tham chiếu vì bạn vừa xóa một tham chiếu trỏ đến chúng) nên được xóa qua bộ sưu tập rác.

• Sau một số lệnh có thể giới thiệu nhiều đối tượng lỏng lẻo. Đây có thể là một nỗ lực rebase lớn, ví dụ.

Và mặt trái, khi nào bạn nên cảnh giác với việc thu gom rác?

• Nếu có những đứa trẻ mồ côi mà bạn có thể muốn phục hồi

• Trong ngữ cảnh của git rerere và bạn không cần phải lưu các độ phân giải mãi mãi

• Trong ngữ cảnh chỉ các thẻ và các nhánh là đủ để khiến Git giữ lại một cam kết vĩnh viễn

• Trong ngữ cảnh của các truy xuất FETCH_HEAD (truy xuất trực tiếp URL qua git fetch) vì chúng ngay lập tức bị thu gom rác


2
Tôi có các cam kết không thể truy cập trong cây của tôi (kết quả là git commit --amend). Điều này có thể được xác minh với git log --reflog. Tôi đẩy một nhánh đến kho lưu trữ từ xa và kiểm tra lại cây của tôi; các cam kết không thể truy cập vẫn còn đó. Rõ ràng git gcđã không chạy khi sự thúc đẩy này xảy ra. Sầu?
chharvey

4

Tôi sử dụng khi tôi thực hiện một cam kết lớn, trên hết là khi tôi xóa nhiều tệp hơn khỏi kho lưu trữ .. sau đó, các cam kết nhanh hơn


1

Bạn không phải sử dụng git gcrất thường xuyên, vì git gc(Bộ sưu tập rác) được chạy tự động trên một số lệnh được sử dụng thường xuyên:

git pull
git merge
git rebase
git commit

Nguồn: git gc thực tiễn tốt nhất và FAQS

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.