如何在Git中获取工作副本的大小?

4

我想计算我当前在git中签出的分支的总工作副本大小(仅限版本化文件;不包括被忽略的文件或尚未成为HEAD后代的文件)。目前我尝试了以下方法:

$ git ls-files | du -k | cut -f1 | awk '{total += $1} END {print total}'

然而,这需要极其漫长的时间,并且输出的数字似乎没有意义:
29800260

我不确定这个数字是什么意思。如果有更快或更准确的命令,请告诉我。


1
du 不会读取标准输入,因此它基本上会忽略你的 git 命令并遍历整个目录树。 - tripleee
2个回答

3

你走在正确的路上,但应该使用反引号而不是竖线。

du -k `git ls-files` | awk '{total += $1} END {print total}'

如果你需要考虑空格问题,git ls-filesxargs都可以使用null字符来处理:

git ls-files -z | xargs -0 du -k | awk '{total += $1} END {print total}'

你花了很长时间是因为git ls-files |本质上没有做任何操作,而du -k |为每个文件从当前目录向下传输输出。这正是你试图避免的!


如果路径中有空格,这段代码就会出错。我该如何让它支持空格呢?例如:Subdir/With Spaces/file.txt - void.pointer

0
请注意,du 显示文件占用的磁盘空间大小。这可能会因文件系统类型和设置而异。例如,一个小的 1 字节文件可能会占用 4 KB 的块,或者其内容可能与元数据一起存储。
如果您想要仓库中所有文件的确切字节大小之和,可以使用以下命令:
git ls-tree -r -l HEAD | cut -d' ' -f 4- | awk '{s+=$1} END {printf "%.0f\n", s}'

这个程序使用存储在Git中的blob大小,并且适用于裸仓库。结果通常比du命令得到的更小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接