【发布时间】:2014-03-16 23:16:40
【问题描述】:
我有一大堆可怕的代码,我正在版本控制中设置它。
如果我运行git add -A && git commit -am 'initial commit',我想要一个可以在 Linux 上运行的命令来提供将提交和推送的文件的总大小
需要总大小,也可以按文件夹细分。
然后我将使用它来建立我的忽略,以便在我将它推高之前将 repo 设置为实际大小
【问题讨论】:
我有一大堆可怕的代码,我正在版本控制中设置它。
如果我运行git add -A && git commit -am 'initial commit',我想要一个可以在 Linux 上运行的命令来提供将提交和推送的文件的总大小
需要总大小,也可以按文件夹细分。
然后我将使用它来建立我的忽略,以便在我将它推高之前将 repo 设置为实际大小
【问题讨论】:
从 2.11 版本开始,git 提供了方便的"count-objects" command
git count-objects -H
如果这还不够,我会推荐来自 github 的 git-sizer: https://github.com/github/git-sizer
git-sizer --verbose
【讨论】:
我使用了它的修改版本,因为我的文件中有空格,导致它崩溃。我也不确定大小计算并删除了无用的head:
git status --porcelain | sed 's/^...//;s/^"//;s/"$//' | while read path; do
du -bs "$path" ;
done | sort -n | awk ' {tot = tot+$1; print } END { printf("%.2fMB\n",tot/(1024*1024)) }'
我更喜欢使用while,因为它比for 稍微安全一些:它仍然可以对包含换行符的文件做一些讨厌的事情,所以我希望有一个可以传递null-separate files 但仍然能够grep 的状态,但我找不到一个好的方法。
【讨论】:
我通过添加一个简单的 awk 语句来调整 edmondscommerce 的答案,该语句对 for 循环的输出求和并打印总和(除以 1024*1024 以转换为 Mb)
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr | awk ' {tot = tot+$1; print } END{ printf("%.2fMb\n",tot/(1024*1024)) }'
注意 --porcelain 打印相对于 git repos 根目录的路径名。因此,如果您在子目录中执行此操作,du 语句将无法找到文件..
(whoppa;我在 SoF 中的第一个答案,愿力量与它同在)
【讨论】:
我想我已经回答了我自己的问题:
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
但是,我愿意接受任何更好的想法或有用的技巧。我目前的输出是 13GB :)
上面的命令基本上就在那里,它从 git status 逐行给我总和,但没有给我总和。我目前正在最后得到所有文件的总数,这是不正确的。我尝试了一些 bc 的使用,但无法让它工作
【讨论】:
由于您只是添加所有内容,因此我认为没有任何理由使用 Git。只需使用普通的 Unix 工具:du, find, &c。
【讨论】: