如何在git存储库中找到N个最大的文件?

Sum*_*mit 40 git

我想在我的存储库中找到10个最大的文件.我想出的脚本如下:

REP_HOME_DIR=<top level git directory>
max_huge_files=10

cd ${REP_HOME_DIR}
git verify-pack -v ${REP_HOME_DIR}/.git/objects/pack/pack-*.idx | \
  grep blob | \
  sort -r -k 3 -n | \
  head -${max_huge_files} | \
  awk '{ system("printf \"%-80s \" `git rev-list --objects --all | grep " $1 " | cut -d\" \" -f2`"); printf "Size:%5d MB Size in pack file:%5d MB\n", $3/1048576,  $4/1048576; }'
cd -
Run Code Online (Sandbox Code Playgroud)

是否有更好/更优雅的方式来做同样的事情?

"文件"是指已经检入存储库的文件.

ypi*_*pid 47

我发现了另一种方法:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4 | tail -n 10
Run Code Online (Sandbox Code Playgroud)

引自:SO:git find fat commit

  • 很棒的答案 - 我将它改为`git ls-tree -r -l --abbrev --full-name HEAD | sort -n -r -k 4 | head -n 10`:你不需要`-t`,因为你对树列表不感兴趣(没有给出大小),`--abbrev`使哈希更易读,而`head`代替`tail`给出按降序排列的列表 (12认同)
  • 不适用于未签出的文件,或过去一段时间存在但已删除但仍在某处 blob 中占用空间的文件。请参阅 raphinesse 的答案以获得更好的解决方案。 (5认同)

rap*_*sse 17

这个bash"one-liner"显示了存储库中10个最大的blob,从最小到最大排序.与其他答案相比,这包括存储库跟踪的所有文件,甚至包括任何分支提示中不存在的文件.

非常快速,易于复制和粘贴,只需要标准的GNU实用程序.

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print substr($0,6)}' \
| sort --numeric-sort --key=2 \
| tail \
| cut --complement --characters=13-40 \
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
Run Code Online (Sandbox Code Playgroud)

前四行实现了核心功能,第五行限制了结果数量,而后两行提供了良好的人类可读输出,如下所示:

...
0d99bb931299  530KiB path/to/some-image.jpg
2ba44098e28f   12MiB path/to/hires-image.png
bd1741ddce0d   63MiB path/to/some-video-1080p.mp4
Run Code Online (Sandbox Code Playgroud)

有关更多信息,包括进一步过滤用例和更适合脚本处理的输出格式,请参阅我对类似问题的原始答案.

  • 你不是在开玩笑,那是快! (4认同)
  • @nfernand这是有意的。OP说:“按'文件',我的意思是已检入存储库中的文件。”。对我来说,其中包括不在当前分支提示中的文件。如果您还需要其他东西,请选择上面的最高答案。 (3认同)

小智 13

怎么样

git ls-files | xargs ls -l | sort -nrk5 | head -n 10
Run Code Online (Sandbox Code Playgroud)

  • 当你在文件名/文件夹中有空格时,这个答案就会失败(尽管你确实得到**一些**输出).这个小改动解决了这个问题:`git ls-files -z | xargs -0 ls -l | sort -nrk5 | 头-n 10` (3认同)
  • 这是基于我当前结帐版本中的文件。如果提交了 10MB 的文件,然后它被另一个版本的 1KB 覆盖,则此命令不会列出该文件。 (2认同)
  • 必须在我的 mac 上使用这个:`git ls-files | xargs -0 | xargs -0 tr '\n' '\0' | xargs -0 杜 -h | 排序-rh` (2认同)

stu*_*dog 6

对 raphinesse 答案的改进,按大小排序,最大的在前:

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print substr($0,6)}' \
| sort --numeric-sort --key=2 --reverse \
| head \
| cut --complement --characters=13-40 \
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
Run Code Online (Sandbox Code Playgroud)


pix*_*x64 5

无法评论。ypid 为 powershell 修改的答案

git ls-tree -r -l --abbrev --full-name HEAD | Sort-Object {[int]($_ -split "\s+")[3]} | Select-Object -last 10
Run Code Online (Sandbox Code Playgroud)

编辑 raphinesse 的解决方案(ish)

git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | Where-Object {$_ -like "blob*"} | Sort-Object {[int]($_ -split "\s+")[2]} | Select-Object -last 10
Run Code Online (Sandbox Code Playgroud)

  • 不适用于未签出的文件,或过去一段时间存在但已删除但仍在某处 blob 中占用空间的文件。请参阅 raphinesse 的答案以获得更好的解决方案。 (2认同)
  • 这是唯一一个在 Windows 上对我有用且没有 PowerShell 抱怨的方法 (2认同)

Fir*_*ero 1

您还可以使用du- 例如:du -ah objects | sort -n -r | head -n 10. du 获取对象的大小,sort然后使用 挑选前 10 个head