查找Git中未提交或未跟踪文件的总大小

19

我有一大堆可怕的代码,并正在将其设置到版本控制中。

我想在Linux上运行一个命令,以给出如果运行git add -A && git commit -am 'initial commit',将提交和推送的文件总大小。

需要总大小,还会很方便地按文件夹进行分解。

然后我将使用此信息来构建我的忽略文件,以便在将其推送之前使存储库达到实际大小。

6个回答

14

我认为我已经回答了自己的问题:

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,但无法使其工作。


7

我参考了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)) }' 

请注意 --porcelain 会将路径名打印为相对于git仓库根目录的形式。所以,如果您在子目录中执行此操作,则du语句将无法找到文件。

3

3

我使用了这个修改版本,因为我的文件名中有空格,导致程序崩溃。我也不确定大小计算,并且删除了一个无用的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状态,但我找不到一个好的方法。


0

既然你只是在添加所有内容,我不认为有必要通过Git进行操作。只需使用普通的Unix工具:dufind等。


2
原因是我会忽略一些东西,然后运行这个命令来查看我已经缩小到什么程度。 - edmondscommerce

0
我想要一个更智能的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

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