如何获取整个 git 历史的文件夹大小

Posted

技术标签:

【中文标题】如何获取整个 git 历史的文件夹大小【英文标题】:How to get the folder size for the whole git history 【发布时间】:2019-12-05 11:15:53 【问题描述】:

我在 git 中有一些包含不同文件的文件夹(例如小图像)。图像的每次更改/插入都将永久存储在 git 历史记录中。如果该文件夹增长过多,例如超过 50mb,则可能会给该 git 存储库的所有用户带来一些问题。

由于某些原因,我不能使用git-lfs,因为它会产生很大的问题。

所以问题是:如何计算历史中所有提交中所选目录中所有文件的大小?或者一些想法如何实现它?

【问题讨论】:

***.com/questions/8185276/find-size-of-git-repo @SaurabhPBhandari 我肯定看过那篇文章,但它只有助于找到所有 repo 的大小,但我需要找到 repo 中确切文件夹的大小 所以git count-objects -vH 不适合我 下面的答案有帮助吗? @SaurabhPBhandari 它可以工作,但不幸的是我同时做了我自己的。两者都有效,但显示不同的结果。稍后我会做一些测试,并确切知道哪个按预期工作。 【参考方案1】:

正如@Mehrdad 在answer 中提到的Find size of git repo,可以使用以下命令来查找git repo 的大小:

git rev-list --objects --all | git cat-file --batch-check="%(objectsize) %(rest)" | cut -d" " -f1 | paste -s -d + - | bc

rev-list 将路径作为参数。因此,要在 git repo(所有提交)中查找目录的大小(例如:foo/bar),您可以运行:

git rev-list --objects --all -- foo/bar | git cat-file --batch-check="%(objectsize) %(rest)" | cut -d" " -f1 | paste -s -d + - | bc 

然而,这将返回以字节为单位的大小。您可以将输出通过管道传输到 numfmt util 以获得更易于阅读的格式。

git rev-list --objects --all -- <relative-path-to-directory> | git cat-file --batch-check="%(objectsize) %(rest)" | cut -d" " -f1 | paste -s -d + - | bc | numfmt --to=si

注意: --all 包含所有修订,您可以指定分支或标签名称。

【讨论】:

【参考方案2】:

我使用git loggit show 得到了结果

RESULT=0
OUTP=$(git log --pretty=tformat:%H -- path/to/data | while read hash; do
    git show --stat --name-only $hash | grep "^path/to/data" | while read filename; do
        if [ ! -z "$filename" ]; then
            git show "$hash:$filename" | grep "^size " | while read filesizeString; do
                filesize=$filesizeString#"size "
                echo $filesize
            done
        fi
    done
done)

echo "FINISHED"

while IFS= read -r line; do
    RESULT=$((RESULT += line))
done <<< "$OUTP"
RESULT_MB=$((RESULT/1024/1024))
echo "Directory takes $RESULT_MB mb in git repository"

但我不知道为什么这种方式显示的大小与@Saurabh P Bhandari 的不同

【讨论】:

有时git show 会给出不好的结果,该脚本并不是所有情况下的最佳选择:/

以上是关于如何获取整个 git 历史的文件夹大小的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Git 历史记录中永久删除提交?

git添加文件个数超限制

本地 .git 文件夹的大小 VS 克隆后

Git-大小写敏感问题

Node / Busboy:获取文件大小

sharepoint 获取所有网站集前40w个文件中启用历史版本文件的大小/数量/最后修改时间