내 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