2009-07-09 20 views
97

Khi tôi chạy 'git gui' tôi nhận được một popup mà nóiLàm thế nào để bỏ qua "Object Loose" popup khi chạy 'git gui'

 
This repository currently has approximately 1500 loose objects. 

Sau đó nó cho thấy nén cơ sở dữ liệu. Tôi đã làm điều này trước đây, và nó làm giảm các đối tượng lỏng lẻo đến khoảng 250, nhưng điều đó không ngăn chặn các popup. Nén lại không làm thay đổi số lượng vật thể lỏng lẻo.

Quy trình làm việc hiện tại của chúng tôi yêu cầu sử dụng đáng kể 'rebase' khi chúng tôi đang chuyển đổi từ Perforce và Perforce vẫn là SCM chính tắc. Một khi Git là SCM kinh điển, chúng ta sẽ thực hiện các phép sáp nhập thông thường, và các vấn đề đối tượng lỏng lẻo cần được giảm thiểu đáng kể.

Đồng thời, tôi thực sự muốn làm cho cửa sổ bật lên 'hữu ích' này biến mất.

+0

Hộp thoại đó là một ví dụ tuyệt vời về "tính năng" mà nhiều người mong muốn không tồn tại . Nó không chỉ gây phiền nhiễu, nó có thể xóa các cam kết quan trọng đã trở thành tách ra sau khi thiết lập lại cứng. – adelriosantiago

Trả lời

132

Vì chưa có ai trả lời, tôi đã xem mã để xem cách xóa mã hiển thị hộp thoại đó. Tôi đã tìm thấy thủ tục hint_gc thực hiện nó và địa điểm được gọi. Đồng thời tôi nhận thấy rằng cuối năm 2011 đã được thêm a configuration option for disabling the dialog. Sự thay đổi này (một phần của git-gui 0,16.0) đã được sáp nhập vào đường chính của Git trên 2011-12-14.

Vì vậy, nếu bạn sử dụng Git v1.7.9 hoặc mới hơn, bạn có thể vô hiệu hóa các hộp thoại cảnh báo với lệnh sau đây:

git config --global gui.gcwarning false 

Nếu bạn đang sử dụng một phiên bản cũ, sau đó bạn có thể chỉnh sửa và loại bỏ /lib/git-core/git-gui dòng after 1000 hint_gc hoặc chỉnh sửa /usr/share/git-gui/lib/database.tcl và xóa phần thân của thủ tục hint_gc. (Các đường dẫn tệp này nằm trên Cygwin - trên các môi trường khác các tệp có thể ở một vị trí khác. Đối với Windows là c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

+1

Chúng ta có thể tăng 'sau 1000 hint_gc' để cảnh báo xảy ra sau khi' 10000' các vật thể lỏng lẻo? – sashoalm

+0

@sashoalm Tôi đồng ý. Nó ở đó vì một lý do. – HankCa

27

Khi "Object Loose" popup Tôi biết đó là thời gian để chạy bộ thu rác git:

git gc 

Sau đó popup sẽ biến mất.

Cập nhật: (do đề nghị T.E.D. của)

tôi trích thói quen dưới đây từ git/share/git-gui/lib/database.tcl
Bạn có thể sửa đổi nó để đáp ứng nhu cầu của bạn.

proc hint_gc {} { 
    set object_limit 8 
    if {[is_Windows]} { 
     set object_limit 1 
    } 

    set objects_current [llength [glob \ 
     -directory [gitdir objects 42] \ 
     -nocomplain \ 
     -tails \ 
     -- \ 
     *]] 

    if {$objects_current >= $object_limit} { 
     set objects_current [expr {$objects_current * 256}] 
     set object_limit [expr {$object_limit * 256}] 
     if {[ask_popup \ 
      [mc "This repository currently has approximately %i loose objects. 

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist. 

Compress the database now?" $objects_current $object_limit]] eq yes} { 
      do_gc 
     } 
    } 
} 
+0

Không nhấp vào OK trong hộp thoại sẽ thực hiện điều đó? Nếu gc không loại bỏ tất cả các vật thể lỏng lẻo thì anh ta vẫn nhận được hộp thoại. –

+0

Tôi đã nhấp vào 'OK' và tôi đã chạy 'git gc' từ dòng lệnh - cả hai đều khiến tôi giảm xuống 250, nhưng thực hiện lại lần nữa sẽ không còn tiến bộ nào nữa. –

+3

Tôi biết nó kỳ lạ nhưng làm sạch các cơ sở từ gui đôi khi rời khỏi các đối tượng lỏng lẻo. Tôi đóng gui, chạy git-gc, và tất cả rác đều biến mất. –

3

Hmmmm .... Tôi không thấy đối số dòng lệnh cho điều đó trong docs.

Tôi cho rằng bạn luôn có thể rút nguồn xuống, lấy mã cho hộp thoại và xây dựng lại.

+0

+1, có lẽ đó là giải pháp duy nhất. –

43

Cập nhật: git prune sẽ "giải quyết" vấn đề này, ở chỗ nó sẽ loại bỏ các đối tượng lỏng lẻo
(git gc cuộc gọi git prune, nhưng chỉ cho các đối tượng lỏng lớn hơn hai tuần, theo mặc định).
Tuy nhiên, khi OP Michael Donohue đề cập trong các ý kiến:

tôi làm như các khía cạnh an toàn của việc giữ các đối tượng lỏng lẻo xung quanh trong hai tuần, tôi nên muốn quay trở lại và xem xét một số phiên bản cũ, vì vậy tôi don không thực sự thích giải pháp này.
Tôi không gặp rắc rối với kích thước hoặc hiệu suất của git, nó chỉ là 'git gui', khăng khăng yêu cầu tôi nén cơ sở dữ liệu, ngay cả khi nén cơ sở dữ liệu sẽ không có hiệu lực.


Original câu trả lời:

Các vấn đề của "git gc" không loại bỏ tất cả vật lỏng lẻo đã được báo cáo trước (cuối năm 2008, ""git gc" doesn't seem to remove loose objects any more"

git gc chỉ loại bỏ lỏng lẻo đối tượng lớn hơn hai tuần, nếu bạn thực sự muốn loại bỏ chúng ngay bây giờ, hãy chạy git prune. chắc chắn không có quá trình git nào khác có thể hoạt động khi bạn chạy nó, hoặc nó có thể có thể bước trên một cái gì đó.

"git gc" sẽ giải nén các đối tượng không thể truy cập được và hiện đang được đóng gói.
Kết quả là, dung lượng đĩa được sử dụng bởi kho lưu trữ git thực sự có thể đi lên một cách đáng kể sau hoạt động "git gc", điều này có thể gây ngạc nhiên cho người đang chạy gần đầy trên hệ thống tệp của họ. các chi nhánh từ kho lưu trữ theo dõi và sau đó thực hiện "git gc" có thể gây bất ngờ rất khó chịu.

[ Ví dụ: ] Chi nhánh cũ được đặt trước thông qua thẻ chẳng hạn như next-20081204.
Nếu bạn cập nhật bản sao cục bộ của mình trong kho lưu trữ linux-next mỗi ngày, bạn sẽ tích luỹ một số lượng lớn các thẻ nhánh cũ này.
Nếu sau đó bạn xóa toàn bộ chuỗi và chạy git-gc, thao tác này sẽ mất nhiều thời gian và số lượng khối và inodes được sử dụng sẽ tăng đáng kể.

Chúng sẽ biến mất sau "git prune", nhưng khi tôi thực hiện thao tác dọn dẹp này, tôi thường muốn có tùy chọn --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repository cho "git gc".

Vì vậy, trong trường hợp của bạn, "git prune" có hữu ích không?

(có thể sử dụng "now" trong biến cấu hình gc.pruneexpire, cần thiết cho hành vi trên xảy ra).


Bạn cũng có (từ cùng một sợi):

repack -a -d -l 

Chú ý các chữ thường 'a'.

git-gc gọi lại bằng chữ hoa 'A' là nguyên nhân khiến các đối tượng không thể truy cập được giải nén. Little 'a', dành cho những người biết họ đang làm gì và muốn git chỉ thả những vật thể không thể tiếp cận.

+1

'git prune' có lẽ sẽ giải quyết vấn đề trước mắt của tôi - tôi sẽ thử sau ngày hôm nay. Tuy nhiên, tôi thích khía cạnh an toàn của việc giữ các vật thể lỏng lẻo trong khoảng hai tuần, nên tôi muốn quay lại và xem xét một số bản sửa đổi cũ, vì vậy tôi không thực sự thích giải pháp này. Tôi không gặp rắc rối với kích thước hoặc hiệu suất của git, nó chỉ là 'git gui', khăng khăng yêu cầu tôi nén cơ sở dữ liệu, ngay cả khi nén cơ sở dữ liệu sẽ không có hiệu lực. –

+0

nhận xét rất hữu ích. Đó là tin nhắn "đối tượng lỏng lẻo" gây phiền nhiễu đã nhận được thực sự gây phiền nhiễu. Số lượng đó đến từ đâu? Đầu ra của git-fsck, có lẽ? –

+0

cảm ơn - tôi cũng đã có các đối tượng lỏng lẻo mà git gc đã không được gỡ bỏ - git prune là câu trả lời. – shedd

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