我有一大堆可怕的代码,并正在将其设置到版本控制中。
我想在Linux上运行一个命令,以给出如果运行git add -A && git commit -am 'initial commit'
,将提交和推送的文件总大小。
需要总大小,还会很方便地按文件夹进行分解。
然后我将使用此信息来构建我的忽略文件,以便在将其推送之前使存储库达到实际大小。
我认为我已经回答了自己的问题:
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
然而,我对任何更好的想法或有用的技巧持开放态度。我的当前输出为13GB :)
上述命令基本上是给出了git状态的总行数,但没有给出总和。我目前正在获得所有文件的总和,这是不正确的。我尝试使用bc
,但无法使其工作。
我参考了edmondscommerce的答案,并添加了一个简单的awk语句,它将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)) }'
git count-objects -H
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
分隔的文件,但仍然能够grep状态,但我找不到一个好的方法。
既然你只是在添加所有内容,我不认为有必要通过Git进行操作。只需使用普通的Unix工具:du
,find
等。
git add
,但出于更增量的原因。我写了这个fish函数: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