에서 언급 한 바와 같이 ,이 SO 응답 , git gc
실제로 REPO의 크기를 늘릴 수 있습니다!
이 스레드 참조
이제 git에는 ' '를 실행할 때 참조되지 않은 객체를 즉시 삭제 하지 않는 안전 메커니즘이 있습니다 git gc
.
기본적으로 참조되지 않은 개체는 2 주 동안 보관됩니다. 이는 실수로 삭제 된 브랜치 또는 커밋을 쉽게 복구 할 수 있도록하거나 아직 참조되지 않은 프로세스에서 방금 생성 된 객체 git gc
가 병렬로 실행 되는 ' '프로세스에 의해 삭제 될 수있는 경합을 방지하기위한 것 입니다.
따라서 압축되었지만 참조되지 않은 개체에 유예 기간을 제공하기 위해 재 압축 프로세스는 참조되지 않은 개체를 팩에서 느슨한 형태로 밀어 넣어 노화되고 결국 정리 될 수 있도록합니다.
참조되지 않는 객체는 일반적으로 그렇게 많지 않습니다. 404855 개의 참조되지 않은 개체를 갖는 것은 상당히 많은 일이며, 복제를 통해 이러한 개체를 처음에 보내는 것은 어리 석고 네트워크 대역폭을 완전히 낭비하는 것입니다.
어쨌든 ... 문제를 해결하려면 유예 기간을 비활성화하고 참조되지 않은 객체를 즉시 제거 git gc
하는 --prune=now
인수 와 함께 ' ' 를 실행하기 만하면 됩니다 (동시에 다른 git 활동이 발생하지 않는 경우에만 안전함). 워크 스테이션에서 쉽게 확인할 수 있습니다).
그리고 BTW, ' git gc --aggressive
'를 최신 git 버전 (또는 ' git repack -a -f -d --window=250 --depth=250
') 과 함께 사용
같은 스레드는 언급 :
git config pack.deltaCacheSize 1
이는 델타 캐시 크기를 무제한을 의미하는 기본값 0 대신 1 바이트 (효과적으로 비활성화)로 제한합니다. 이를 통해 git repack
4GB RAM과 4 개의 스레드 (쿼드 코어)를 사용하는 x86-64 시스템 에서 위의 명령을 사용하여 해당 저장소를 다시 포장 할 수 있습니다. 하지만 상주 메모리 사용량은 거의 3.3GB로 증가합니다.
시스템이 SMP이고 RAM이 충분하지 않은 경우 스레드 수를 하나만 줄일 수 있습니다.
git config pack.threads 1
또한 --window-memory argument
' git repack
' 를 사용하여 메모리 사용량을 추가로 제한 할 수 있습니다 .
예를 들어를 사용 --window-memory=128M
하면 델타 검색 메모리 사용량에 대한 합리적인 상한을 유지해야하지만 저장소에 많은 대용량 파일이 포함 된 경우 최적의 델타 일치가 줄어들 수 있습니다.
필터 분기 전면 에서이 스크립트 를 신중하게 고려할 수 있습니다.
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune