‘git gui’실행시“Loose Object”팝업을 건너 뛰는 방법 다음 데이터베이스

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

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

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

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

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



답변

아무도 아직 답을 얻지 못했기 때문에 해당 대화 상자를 표시하는 코드를 제거하는 방법을 알아보기 위해 코드를 조사했습니다. 나는 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


답변

업데이트 : 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이 도달 할 수없는 개체를 삭제하기를 원하는 사람들을위한 것입니다.


답변

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

답변

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

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