如何显示 git 历史记录中最大的 10 个项目

如何显示 git 历史记录中最大的 10 个项目

我发现这个命令可以从我的 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

解压 Git packfile

Git 内部原理 - Packfiles

Git-通过 SHA1 查找文件名

答案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 列。

相关内容