我需要让回购更小。我想我可以通过从git历史中删除有问题的二进制文件来缩小它:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch BigFile'
然后释放对象:
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
(如果这些命令错误,请随意发表评论。)
问题:如何识别那些大文件,以便我可以评估是否将它们从git历史中删除?很可能他们不再在工作树中了 - 他们已被删除,可能还没有跟踪:
git rm --cached BigFile
答案 0 :(得分:20)
您可以找到最大对象的哈希ID,如下所示:
git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr
然后,对于特定的SHA,您可以执行此操作以获取文件名:
git rev-list --all --objects | grep <SHA>
不确定是否有更有效的方法。如果您确定所有内容都在包文件中(而不是松散的对象),git verify-pack -v
会生成包含大小的输出,我似乎记得在某个地方看到一个解析该输出并将每个对象与之匹配的脚本原始文件。
答案 1 :(得分:1)
我写了一个脚本,告诉你答案here中最大的对象,文件或目录。没有参数,它会告诉您所有对象的大小,按大小排序。您可以告诉它--sum
或--directories
将每个文件的所有对象相加并打印出来,或对每个目录中的所有文件执行相同操作。我希望它有用!
答案 2 :(得分:0)
禁不住优化MatrixManAtYrService的答案:
git rev-list --all --objects | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' | grep blob | sort -k3nr | head -n 20
这样git rev-list
仅被调用一次(而不是针对每个显示的对象),并且脚本更加清晰。
答案 3 :(得分:0)
使用 git-filter-repo,您可以分析存储库中占用的空间。
git filter-repo --analyze
要查看最大的已删除文件,请参阅:
.git/filter-repo/analysis/path-deleted-sizes.txt