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)) }'
function gitadd
set size (git status --short | grep -v '^ D' | awk '{print substr($0,4)}' | xargs -n 1 du -b | awk '{print $1}' | sum)
if test $size -lt 1048576 # 1MiB
git add .
else
git status --short | grep -v '^ D' | awk '{print substr($0,4)}' | xargs -n 1 du -h
git diff --stat --relative
return 1
end
end
function sum
set accumulator 0
while read -l line
set accumulator (math $accumulator+$line)
end
echo $accumulator
end
6条答案
按热度按时间2nc8po8w1#
我想我已经回答了自己的问题:
字符串
不过,我愿意接受任何更好的想法或有用的技巧。我的当前输出是13GB:)
上面的命令基本上就在那里,它从git status中逐行给我总数,但不给我总数。我目前得到的所有文件的总数在年底这是不正确的。我尝试了一些
bc
的用法,但无法让它工作z9smfwbn2#
我修改了edmondscommerce的答案,添加了一个简单的awk语句,它对for循环的输出求和并打印出总和(除以1024*1024转换为Mb)
字符串
注意--porcelain会打印相对于git仓库根目录的路径名。所以,如果你在子目录中这样做,du语句将无法找到文件。
(whoppa;我在SoF的第一个答案,愿原力与它同在)
hpxqektj3#
我使用了一个修改过的版本,因为我的文件中有空格,这使得它崩溃。我也不确定大小计算,并删除了一个无用的
head
:字符串
我更喜欢使用
while
,因为它比for
稍微安全一些:它仍然可以做一些讨厌的事情,在他们的文件有换行符,所以我希望有一个传递null
-分离的文件,但仍然能够grep的状态,但我找不到一个好的方法。lf5gs5x24#
从版本2.11开始,git提供了一个方便的"count-objects"命令:
字符串
如果这还不够,我推荐git-sizer:https://github.com/github/git-sizer的
型
详细用法在这里:https://github.com/github/git-sizer/#usage
2exbekwf5#
既然你只是添加所有东西,我看不出有任何理由通过Git。使用Unix工具:
du
、find
等。wlwcrazw6#
我也想要一个更智能的
git add
,但更多的原因是增量。我想到了这个鱼函数:字符串