如何减小git repo的大小?

时间:2015-12-13 03:29:14

标签: git version-control

我的git repo应该相对较小,但我过去提交了大文件,所以我的.git/objects/pack文件非常大。我很久没有触及过这个回购,所以我不知道导致回购的文件名大小比它需要的大得多。

如何缩小git repo的大小?

2 个答案:

答案 0 :(得分:1)

通常,您需要重写Git历史记录并删除这些文件:https://git-scm.com/book/en/v1/Git-Tools-Rewriting-History

之后你强行推进回购,你应该完成。

如果需要重写,我通常会使用git rebase -i <options>,但这取决于您的具体情况。

PS:还要注意这样做的意义(分支可能没有父母,其他人会因为硬重置而变硬,所以你可能会重新获得这些文件等)

答案 1 :(得分:0)

Finding and purging big files from git history是一篇关于如何查找和删除大文件的精彩文章。

最基本的步骤是:

1)Git有一个唯一的SHA,它在整个历史记录中与每个对象(例如它调用blob的文件)相关联。这有助于我们找到该对象并决定是否值得在以后删除:

git rev-list --objects --all | sort -k 2 > allfileshas.txt

2)获取所有已提交文件的最后一个对象SHA,并按从大到小的顺序对它们进行排序:

git gc && git verify-pack -v .git/objects/pack/pack-*.idx | egrep "^\w+ blob\W+[0-9]+ [0-9]+ [0-9]+$" | sort -k 3 -n -r > bigobjects.txt

3)获取结果并遍历每一行以查找SHA,文件大小(以字节为单位)和真实文件名(您还需要上面的allfileshas.txt输出文件):

for SHA in `cut -f 1 -d\  < bigobjects.txt`; do
echo $(grep $SHA bigobjects.txt) $(grep $SHA allfileshas.txt) | awk '{print $1,$3,$7}' >> bigtosmall.txt
done;

4)使用filter-branch删除文件/目录(将MY-BIG-DIRECTORY-OR-FILE替换为您要删除的路径相对于git repo的根目录:

git filter-branch --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch MY-BIG-DIRECTORY-OR-FILE' --tag-name-filter cat -- --all

5)然后克隆回购并确保不留下任何硬链接:

git clone --no-hardlinks file:///Users/yourUser/your/full/repo/path repo-clone-name

5)这篇文章没有包含在内,但是我需要强制推送回购

git push --force