我的git repo应该相对较小,但我过去提交了大文件,所以我的.git/objects/pack
文件非常大。我很久没有触及过这个回购,所以我不知道导致回购的文件名大小比它需要的大得多。
如何缩小git repo的大小?
答案 0 :(得分:1)
通常,您需要重写Git历史记录并删除这些文件:https://git-scm.com/book/en/v1/Git-Tools-Rewriting-History
之后你强行推进回购,你应该完成。
如果需要重写,我通常会使用git rebase -i <options>
,但这取决于您的具体情况。
答案 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