.git 폴더를 어떻게 정리할 수 있습니까? 내 프로젝트 디렉토리를 정리했지만 .git은 여전히 ​​방대합니다.


85

내 rails 프로젝트 디렉토리 의 .git / objects 는 실수로 생성 된 수백 메가 바이트의 쓰레기를 삭제 한 후에도 여전히 방대합니다.

나는 git add -A색인을 업데이트하고 존재하지 않는 파일을 제거하기 위해 다른 명령뿐만 아니라 시도했습니다 . 디렉토리에 두 개의 문자 이름이있는 파일이 blob이라는 잘못된 정보를 수집합니다. 이전 커밋으로 롤백을 시도했지만 운이 없습니다.

이 디렉토리를 정리하려면 어떻게해야합니까?

답변:


137
  • 파일을 추가 한 다음 제거하면 Blob이 여전히 존재하지만 매달려 있습니다. git fsck연결할 수없는 Blob을 나열하고 git prune삭제합니다.

  • 파일을 추가하고 커밋 한 다음로 롤백하면 파일 git reset --hard HEAD^이 조금 더 깊숙이 붙어 있습니다. git fsck분기의 reflog 가 보유하고 있기 때문에 매달려있는 커밋이나 블롭을 나열하지 않습니다 . 기록에 적합한 개체 만 유지되도록하는 한 가지 방법은 다음과 같습니다.

    git reflog expire --expire=now --all
    git repack -ad  # Remove dangling objects from packfiles
    git prune       # Remove dangling loose objects
    
  • 또 다른 방법은 저장소를 복제하는 것입니다. 이는 도달 할 수있는 객체 만 전달하기 때문입니다. 그러나 매달린 객체가 압축 된 경우 (많은 작업을 수행 한 경우 git이 자동으로 압축되었을 수 있음) 로컬 복제본이 전체 packfile을 전달합니다.

    git clone foo bar                 # bad
    git clone --no-hardlinks foo bar  # also bad
    

    git이 새 팩을 계산하도록하려면 프로토콜을 지정해야합니다.

    git clone file://foo bar  # good
    

네, 문제를 알아 채기 전에 커밋했습니다. 나는 마지막 명령을 제외한 모든 것을 시도했습니다. 내 프로젝트 디렉토리에서 실행하면 "경고 : 빈 저장소를 복제 한 것 같습니다." 나는 문서를 읽고 있지만 무거운 물건입니다. 클론을 올바른 소스로 지정하려면 어떻게해야합니까?
light24bulbs 2011 년

1
@user file://fooURL은 현재 디렉토리에 상대적이며 file:///home/me/foo(슬래시 세 개)는 절대적입니다.
Josh Lee

감사! 크기는 절반으로 줄 였지만 제 팩은 여전히 ​​나머지 저장소 크기의 10 배입니다. 나는 가지 치기를 시도했다 ..
light24bulbs 2011 년

1
@user 많은 커밋에 큰 파일이 잘못 포함 된 경우 git-filter-branch 를 사용하여 파일 을 선택하는 것이 좋습니다.
Josh Lee

2
죄송합니다. 효과가 없습니다. 내 개발 책임자는 크기가 이제 허용 가능하지만 바람직하지 않은 범위 내에 있다고 말합니다. 숟가락으로 계속 먹이를 줄 시간이 있다면 그것은 훌륭 할 것입니다. 그러나 당신은 나를 다시 제 발로 되돌려 놓았습니다. 감사합니다 jleedev.
light24bulbs 2011 년


13

Sparkleshare는 거대한 이미지 체크인을 여러 번 가져 오지 못한 후 내 자식에 13GB의 tmp_pack_ 파일을 생성했습니다. 도움이 된 유일한 것은 ...

rm -f .git/objects/*/tmp_*

'git gc'는 해당 파일을 제거하지 않았습니다.


그것은 꽤 무차별 대입 솔루션이지만 작동하지 않을 이유가 없습니다. 좋은!
light24bulbs

1
절박한 상황은 절박한 대책이 필요하고, 매력처럼 작용했다! Tks.
medina

rm은 Linux 명령 용입니까? Windows 사용자는 어떻습니까?
gumuruh

7

가지 치기 및 재 포장 ( gc --aggressive --prune=tomorrow...) 후에도 여전히 큰 저장소가있는 경우 간단히 이상한 것을 찾을 수 있습니다.

git rev-list --objects --all |
    while read sha1 fname
    do 
        echo -e "$(git cat-file -s $sha1)\t$\t$fname"
    done | sort -n

이렇게하면 오름차순으로 정렬 된 개체 목록이 제공됩니다. git-filter-branch를 사용하여 저장소에서 범인을 제거 할 수 있습니다.

지침 은 http://progit.org/book/ch9-7.html의 "객체 제거"를 참조하십시오.


@DavidJames 힌트 주셔서 감사합니다. 나는 그것이 더 읽을 IMO 만든
sehe

다른 사람이이 문제를 겪을 경우 : 괄호 안의 args에 오타가 있습니다 : should be --aggressive. 편집을 시도했지만 그렇게 작은 오타를 편집 할 수 없다는 것이 밝혀졌습니다.
hellobenallan 2015

노트에 대한 @hellobenallan 감사, 고정
sehe

1

재귀 적으로 :

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.