如何获取整个 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 log
和git 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 历史的文件夹大小的主要内容,如果未能解决你的问题,请参考以下文章