我发现这个命令可以从我的 git 历史记录中获取前 10 个最大的文件(在这个封闭的问题中https://github.com/18F/C2/issues/439)
git verify-pack -v .git/objects/pack/pack-7b03cc896f31b2441f3a791ef760bd28495697e6.idx \
| sort -k 3 -n \
| tail -10
现在显示的内容如下:
32f0dac6ee67325ca12b9c03279ee2dbc7790567 blob 12732444 11425432 1091676437
c63c2851049c51eabbcd54cb46cad367d4e0d593 blob 14368670 12189261 246241495
这些数字代表什么?它们中的哪一个代表文件大小?如果有人能分解并解释 top 命令,我将不胜感激。我不明白。
答案1
为了减少文件占用的空间,git 将存储库中存储的对象打包到一个.pack
文件中。此打包文件包含实际的 git 对象,并包含.idx
用于快速定位打包文件中对象的索引。
$ git verify-pack -v .git/objects/pack/pack-7b03cc896f31b2441f3a791ef760bd28495697e6.idx
上述命令读取给定的.idx
文件并将其与相应的包文件进行验证。使用-v
您将获得详细的输出。
输出中的第三列是对象的大小。sort -k 3 -n
我们使用第三列(基于大小)对输出进行数字排序,并tail -10
截取最后 10 个最大的对象。
从文件的哈希值中获取文件的名称:
$ git ls-tree -r HEAD | grep HASH
获取所有姓名的列表:
$ git verify-pack -v .git/objects/pack/pack-1daab5282d01ab18db98e21a985eb2d288f7faa0.idx | sort -k 3 -n | tail | cut -f1 -d' ' | while read i; do git ls-tree -r HEAD | grep "$i"; done
100644 blob 6209b3840fa470a534e670cff93bce698ba60819 .bashrc
100644 blob 1131e7127cb2cf6c1f854f728a1794262cdf85f6 .vimrc
100644 blob a249a5ae9b33553f4484da42a019ed14e5f44e21 .vim/colors/clrs.vim
100644 blob f329f223953827e59954f67ad4d76568b6dd894e .config/openbox/rc.xml
阅读更多:
$ git verify-pack--help
答案2
以下是使用 git 子ls-tree
命令解决此问题的另一个巧妙方法:
$ git ls-tree -rl HEAD | sort -k4 -n | tail | awk '{print $4, $5}' |
numfmt --to=iec-i
4.0Ki .bashrc
4.0Ki .config/conky/conky.conf
4.5Ki .config/rofi/config.rasi
5.4Ki .vim/notes
7.2Ki .config/tint2/tint2rc
7.5Ki .bash_functions
7.5Ki .vimrc
19Ki .vim/colors/clrs.vim
38Ki .config/openbox/rc.xml
63Ki .config/ipfilter.dat
-r
以递归方式列出文件。-l
显示 blob(文件)条目的对象大小。sort -k4 -n
根据第四列按数字排序。tail
剪掉最后 10 项。- 用来
awk
仅获取输出中的第 4 列和第 5 列。