'git gui'실행시“Loose Object”팝업을 건너 뛰는 방법


123

'git gui'를 실행하면 다음과 같은 팝업이 나타납니다.

이 저장소에는 현재 약 1500 개의 느슨한 개체가 있습니다.

그런 다음 데이터베이스 압축을 제안합니다. 이전에이 작업을 수행했으며 느슨한 개체를 약 250 개로 줄 였지만 팝업을 억제하지는 않습니다. 다시 압축해도 느슨한 개체의 수가 변경되지 않습니다.

현재 워크 플로는 Perforce에서 전환 할 때 'rebase'를 많이 사용해야하며 Perforce는 여전히 표준 SCM입니다. Git이 표준 SCM이되면 정기적으로 병합을 수행하고 느슨한 객체 문제를 크게 완화해야합니다.

그동안 저는이 '유용한'팝업을 정말 없애고 싶습니다.


1
이 대화는 많은 사람들이 존재하지 않았 으면하는 "기능"의 훌륭한 예입니다. 귀찮을뿐만 아니라 하드 리셋 후 분리 된 중요한 커밋을 지울 수 있습니다.
adelriosantiago

답변:


169

아무도 아직 답을 얻지 못했기 때문에 해당 대화 상자를 표시하는 코드를 제거하는 방법을 알아보기 위해 코드를 조사했습니다. 나는 hint_gc그것을 하는 절차와 그것이 호출되는 곳을 찾았습니다 . 동시에 2011 년 말 에 대화 상자를 비활성화하는 구성 옵션 이 추가되었음을 알았습니다 . 이 변경 사항 (git-gui 0.16.0의 일부)은 2011-12-14 에 Git의 메인 라인에 병합되었습니다 .

따라서 Git v1.7.9 이상을 사용하는 경우 다음 명령을 사용하여 경고 대화 상자를 비활성화 할 수 있습니다.

git config --global gui.gcwarning false

이전 버전을 사용하는 경우 행을 편집 및 제거 하거나 절차 본문을 편집 /lib/git-core/git-gui및 제거 할 수 있습니다 . (이러한 파일 경로는 Cygwin에 있습니다. 다른 환경에서는 파일이 다른 위치에있을 수 있습니다. Windows의 경우 )after 1000 hint_gc/usr/share/git-gui/lib/database.tclhint_gcc:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl


3
느슨한 물체 after 1000 hint_gc후에 경고가 발생하도록 늘릴 수 있습니까 10000?
sashoalm

@sashoalm 동의합니다. 이유가 있습니다.
HankCa 2011

그 이유가 정확히 무엇인지 궁금해서, 그 대화는 그토록 고통 스럽습니다. 좋은 이유가 명확하게 설명되지 않은 상태에서 저는 확실히 위의 명령을 내리고 싶었습니다.
Josh Mc

2
@sashoalm : 아마도 이것이 당신이 의미하는 바일 수도 있지만, "1000"은 after 1000대화 상자가 표시 될 때까지 기다리는 시간 (밀리 초)을 나타냅니다. "10000"으로 늘리면 대화 상자가 계속 표시되지만 대신 10 초가 걸립니다.
fuglede

1
그러나 @NickDandoulakis의 답변에서 언급했듯이 database.tcl제한에 대한 정의가 포함되어 있으며 대화 상자의 빈도를 줄 이도록 늘릴 수 있습니다.
fuglede

50

업데이트 : git prune느슨한 객체를 제거한다는 점에서 문제를 "해결"합니다
(를 git gc호출 git prune하지만 기본적으로 2 주가 지난 느슨한 객체에 대해서만).
그러나 OP Michael Donohue 가 의견에서 언급 했듯이 :

돌아가서 오래된 개정판을보고 싶다면 2 주 동안 느슨한 물체를 보관하는 안전 측면을 좋아하므로이 솔루션이별로 마음에 들지 않습니다.
나는 git의 크기 나 성능에 문제가 없습니다. 데이터베이스를 압축해도 효과가 없을 때도 데이터베이스 압축을 요구하는 것은 'git gui'입니다.


원래 답변 :

" git gc" 모든 느슨한 개체를 제거하지 않는 문제는 이전에보고 된 바 있습니다 (2008 년 후반, " " git gc"은 더 이상 느슨한 개체를 제거하지 않는 것 같습니다 ").

git gc2 주가 지난 느슨한 객체 만 제거합니다. 지금 제거하려면 git prune을 실행하세요.
그러나 실행할 때 다른 git 프로세스가 활성화되지 않았는지 확인하십시오.

" git gc"은 (는) 도달 할 수없고 현재 팩에있는 개체의 압축을 풉니 다 .
결과적으로, 자식 저장소에서 사용하는 디스크 공간의 양이 실제로 갈 수있는 최대 는 "후 극적으로 git gc자신의 파일 시스템 전체에 가까운를 실행하는 사람을 놀라게 할 수있다"작업, 추적 저장소에서 지점의 번호를 삭제 , " git gc" 을 (를) 수행 하면 매우 불쾌한 놀라움을 얻을 수 있습니다.

[예 : ]이전 브랜치는 next-20081204. 매일 저장소
의 로컬 사본을 업데이트하면 linux-next이러한 오래된 분기 태그가 많이 누적됩니다.
그런 다음 일련의 전체를 삭제하고을 실행 git-gc하면 작업에 상당한 시간이 걸리고 사용되는 블록 및 inode 수가 크게 늘어납니다.

" git prune" 후에 사라질 것이지만,이 하우스 키핑 작업을 수행 할 때 --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repository"git gc"옵션을 원했습니다 .

그렇다면 귀하의 경우 " git prune"가 도움이 될까요?

( gc.pruneexpire위의 동작이 발생하는 데 필요한 config 변수 에서 "now"를 사용하여 가능 ).


또한 (동일한 스레드에서) :

repack -a -d -l

소문자 'a'에 주목하십시오.

git-gc도달 할 수없는 개체의 압축이 풀리는 원인이되는 대문자 'A'로 repack을 호출합니다. Little 'a'는 자신이하는 일을 알고 있고 git이 도달 할 수없는 개체를 삭제하기를 원하는 사람들을위한 것입니다.


1
'git prune'은 아마도 내 당면한 문제를 해결할 것입니다. 오늘 나중에 시도해 보겠습니다. 그러나 나는 돌아가서 오래된 개정판을보고 싶다면 2 주 동안 느슨한 물체를 보관하는 안전 측면을 좋아하므로이 솔루션이별로 마음에 들지 않습니다. 나는 git의 크기 나 성능에 문제가 없습니다. 데이터베이스를 압축해도 효과가 없을 때도 데이터베이스 압축을 요구하는 것은 'git gui'입니다.
Michael Donohue

매우 유용한 댓글입니다. 그 성가신 "느슨한 개체"메시지는 정말 성가 시게되었습니다. 어쨌든 그 수는 어디에서 왔습니까? git-fsck의 출력일까요?
David Dombrowsky

감사합니다-git gc가 제거하지 않은 느슨한 객체도 있습니다. git prune이 답이었습니다.
shedd

저장소 외부에서 git prune을 수행했으며 일부 개체를 정리했습니다. 그런 다음 문제 저장소로 이동하여 자식 정리를 수행하고 모든 문제가 사라졌습니다.
Nicholas Orlowski 2013 년

"git prune"은 OP ​​(그리고 나)가 가지고있는 문제를 해결합니다. "전에이 작업을 수행했으며 느슨한 객체를 약 250 개로 줄 였지만 팝업을 억제하지는 않습니다."
Eike

32

"Loose Object"팝업이 나타나면 git의 가비지 수집기를 실행할 때임을 알 수 있습니다.

git gc

그 후에 팝업이 사라집니다.

업데이트 : (TED의 제안에 따라)

아래 루틴을 추출 git/share/git-gui/lib/database.tcl
하여 필요에 맞게 수정할 수 있습니다.

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
대화 상자에서 확인을 클릭하면 그렇게하지 않습니까? gc가 모든 느슨한 객체를 제거하지 않았다면 그는 여전히 대화를 얻을 것입니다.
TED

'확인'을 클릭하고 명령 줄에서 'git gc'를 실행했습니다. 둘 다 저를 250 개까지 낮추지 만 다시 수행해도 더 이상 진행되지 않습니다.
Michael Donohue

3
나는 그것이 이상하다는 것을 알고 있지만 GUI에서베이스를 청소하면 때때로 느슨한 물체가 남습니다. GUI를 닫고 git-gc를 실행하면 모든 쓰레기가 사라집니다.
Nick Dandoulakis

3
tcl을 변경하면 문제가 해결됩니다-방금 창 제한을 10 * 250으로 올렸습니다. 감사합니다!
Michael Donohue

나를 git gc위해 명령 줄에서 실행 하면 문제가 해결되었습니다 ... okgit gui를 클릭 하는 것만으로도 트릭을 수행하지 못했습니다 ...
raphael

3

흠 .... 문서 에 명령 줄 인수가 표시되지 않습니다 .

항상 소스를 풀다운하고 대화 상자의 코드를 꺼내고 다시 빌드 할 수 있다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.