'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.