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

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

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

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



답변

  • 파일을 추가 한 다음 제거하면 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
    

답변

git gc명령 을 시도해 보셨습니까 ?


답변

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

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

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


답변

가지 치기 및 재 포장 ( 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의 “객체 제거”를 참조하십시오.


답변

재귀 적으로 :

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done