Cách bỏ qua cửa sổ bật lên “Đối tượng lỏng lẻo” khi chạy 'git gui'


123

Khi tôi chạy 'git gui', tôi nhận được một cửa sổ bật lên cho biết

Kho này hiện có khoảng 1500 đối tượng rời.

Sau đó, nó gợi ý nén cơ sở dữ liệu. Tôi đã làm điều này trước đây và nó giảm các đối tượng lỏng lẻo xuống còn khoảng 250, nhưng điều đó không ngăn chặn cửa sổ bật lên. Nén lại không làm thay đổi số lượng các đối tượng rời.

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' vì chúng tôi đang chuyển đổi từ Perforce và Perforce vẫn là SCM chuẩn. Khi Git là SCM chuẩn, chúng tôi sẽ thực hiện hợp nhất thường xuyên và vấn đề đối tượng lỏng lẻo sẽ được giảm thiểu đáng kể.

Trong thời gian đó, 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.


1
Hộp thoại đó là một ví dụ tuyệt vời về một "tính năng" mà nhiều người ước nó không tồn tại. Nó không chỉ gây khó chịu mà còn có thể xóa các cam kết quan trọng đã bị tách ra sau khi khôi phục cài đặt gốc.
adelriosantiago

Câu trả lời:


169

Vì chưa có câu trả lời nên tôi đã xem mã để xem cách xóa mã hiển thị hộp thoại đó. Tôi đã tìm thấy hint_gcthủ tục thực hiện nó và nơi mà nó được gọi. Đồng thời, tôi nhận thấy rằng cuối năm 2011 đã có thêm một tùy chọn cấu hình để tắt hộp thoại . Thay đổi này (một phần của git-gui 0.16.0) đã được hợp nhất vào dòng chính của Git vào ngày 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ể tắt hộp thoại cảnh báo bằng lệnh sau:

git config --global gui.gcwarning false

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


3
Chúng ta có thể tăng after 1000 hint_gcđể cảnh báo xảy ra sau khi 10000các đối tượng lỏng lẻo?
sashoalm

@sashoalm Tôi đồng ý. Nó có một lý do.
HankCa

Tự hỏi chính xác lý do chính đáng là gì, hộp thoại đó là một nỗi đau, mà không có lý do chính đáng được giải thích rõ ràng, tôi chắc chắn rất muốn chỉ đánh vào lệnh trên.
Josh Mc

2
@sashoalm: Có thể đây là ý của bạn, nhưng "1000" after 1000ám chỉ số mili giây để đợi cho đến khi hộp thoại được hiển thị. Bằng cách tăng nó lên "10000", hộp thoại sẽ vẫn xuất hiện, nhưng thay vào đó sẽ mất 10 giây để làm như vậy.
fuglede

1
Tuy nhiên, như đã đề cập trong câu trả lời của @ NickDandoulakis, database.tclchứa định nghĩa về giới hạn và có thể được tăng lên để làm cho hộp thoại ít thường xuyên hơn.
fuglede

50

Cập nhật: git prunesẽ "giải quyết" vấn đề này, ở chỗ nó sẽ loại bỏ các đối tượng lỏng lẻo
( git gccuộ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, như OP Michael Donohue đề cập trong các bình luậ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 hai tuần, nên tôi muốn quay lại và xem lại 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 bất kỳ khó khăn nào với kích thước hoặc hiệu suất của git, chỉ là 'git gui' khăng khăng yêu cầu tôi nén cơ sở dữ liệu, ngay cả khi việc nén cơ sở dữ liệu sẽ không có tác dụng.


Câu trả lời ban đầu:

Vấn đề " git gc" không loại bỏ tất cả các vật thể lỏng lẻo đã được báo cáo trước đây (cuối năm 2008, " " git gc"dường như không loại bỏ các vật thể lỏng lẻo nữa "

git gcchỉ loại bỏ các đối tượng lỏng lẻo cũ 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 trimne.
Nhưng hãy đảm bảo rằng không có quy trình git nào khác có thể hoạt động khi bạn chạy nó, hoặc nó có thể dẫm lên thứ gì đó.

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

[Ví dụ: ]Các chi nhánh cũ được đặt trước thông qua thẻ như next-20081204.
Nếu bạn cập nhật bản sao cục bộ của linux-nextkho lưu trữ hàng ngày, bạn sẽ tích lũy được một số lượng lớn các thẻ nhánh cũ này.
Sau đó, nếu bạn xóa toàn bộ một loạt chúng và chạy git-gc, hoạt động sẽ mất khá nhiều thời gian và số lượng khối và inode được sử dụng sẽ tăng lên đáng kể.

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

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

(có thể bằng cách sử dụng "now" trong gc.pruneexpirebiến cấu hình, cần thiết để hành vi trên xảy ra).


Bạn cũng có (từ cùng một chủ đề):

repack -a -d -l

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

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


1
'git snine' có lẽ sẽ giải quyết được vấn đề trước mắt của tôi - tôi sẽ thử nó 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 lỏng lẻo xung quanh trong hai tuần, nên tôi muốn quay lại và xem 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 bất kỳ khó khăn nào với kích thước hoặc hiệu suất của git, chỉ là 'git gui' khăng khăng yêu cầu tôi nén cơ sở dữ liệu, ngay cả khi việc nén cơ sở dữ liệu sẽ không có tác dụng.
Michael Donohue

bình luận rất hữu ích. Thông báo "vật thể lỏng lẻo" khó chịu đó thực sự rất khó chịu. Dù sao thì số đó đến từ đâu? Đầu ra của git-fsck, có lẽ?
David Dombrowsky

cảm ơn - tôi cũng có các đối tượng lỏng lẻo mà git gc không loại bỏ - git mận là câu trả lời.
đổ vào

Tôi đã cắt git bên ngoài bất kỳ kho lưu trữ nào và nó đã xóa một số đối tượng. Sau đó, tôi đi vào kho lưu trữ vấn đề và thực hiện cắt ngắn git và tất cả các vấn đề đã biến mất.
Nicholas Orlowski,

"git snine" giải quyết vấn đề mà OP (và tôi) gặp phải: "Tôi đã làm điều này trước đây và nó giảm các đối tượng lỏng lẻo xuống khoảng 250, nhưng điều đó không ngăn chặn cửa sổ bật lên."
Eike

32

Khi cửa sổ bật lên "Loose Object", tôi biết đã đến lúc chạy trình thu gom rác của git:

git gc

Sau đó cửa sổ bật lên biến mất.

Cập nhật: (do TED gợi ý)

Tôi đã trích xuất quy trình 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 mình.

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
        }
    }
}

1
Không nhấp vào OK trong hộp thoại làm điều đó? Nếu gc không loại bỏ tất cả các đối tượng rời, anh ấy vẫn sẽ nhận được hộp thoại.
TED

Tôi đã nhấp vào 'OK' và tôi đã chạy 'git gc' từ dòng lệnh - cả hai đều giúp tôi giảm xuống 250, nhưng thực hiện lại không có tiến triển gì thêm.
Michael Donohue, 09/07/09

3
Tôi biết điều đó thật kỳ lạ nhưng việc lau chùi phần đế khỏi gui đôi khi để lại những vật thể lỏng lẻo. Tôi đóng gui, chạy git-gc, và sau đó tất cả rác đều biến mất.
Nick Dandoulakis, 09/07/09

3
Thay đổi tcl sẽ khắc phục sự cố - Tôi vừa nâng giới hạn cửa sổ lên 10 * 250. Cảm ơn!
Michael Donohue

đối với tôi chạy git gctừ dòng lệnh đã giải quyết được vấn đề ... chỉ cần nhấp okvào git gui bằng cách nào đó không thực hiện được thủ thuật ...
raphael

3

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

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

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.