29

我需要使回购更小。我想我可以通过从 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
4

5 回答 5

25

twalberg 的回答可以解决问题。我将它包装在一个循环中,以便您可以按大小顺序列出文件:

while read -r largefile; do
    echo $largefile | awk '{printf "%s %s ", $1, $3 ; system("git rev-list --all --objects | grep " $1 " | cut -d \" \" -f 2-")}'
done <<< "$(git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr | head -n 20)"

head -n 20将输出限制在前 20 位。根据需要进行更改。

确定问题文件后,请查看答案以了解如何删除它们。

于 2015-09-10T15:45:38.447 回答
23

您可以像这样找到最大对象的哈希 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则生成包含大小的输出,并且我似乎记得在某处看到了一个脚本,该脚本将解析该输出并将每个对象与原始文件进行匹配。

于 2012-11-15T20:01:44.897 回答
6

忍不住优化了 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只调用一次(而不是每个正在显示的对象),并且脚本更清晰。

于 2019-08-19T16:48:07.070 回答
1

我写了一个脚本,它会在我的回答中告诉你最大的对象、文件或目录。没有参数,它会告诉你所有对象的大小,按大小排序。您可以告诉它--sum--directories将每个文件的所有对象相加并打印出来,或者对每个目录中的所有文件执行相同的操作。我希望它有用!

于 2017-07-28T08:05:13.973 回答
0

使用git-filter-repo您可以分析存储库中占用的空间。

git filter-repo --analyze

要查看最大的已删除文件,请参阅:

.git/filter-repo/analysis/path-deleted-sizes.txt
于 2021-04-08T08:22:08.377 回答