Я нашел эту команду, чтобы получить 10 самых больших файлов из моей истории git (в этом закрытом выпуске 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
Что представляют собой эти цифры? Какой из них размер файла? Также я был бы очень признателен, если бы кто-нибудь смог сломаться и объяснить верхнюю команду. Я не понимаю этого.
Чтобы уменьшить пространство, используемое файлами, git упаковывает объекты, хранящиеся в репозитории, в файл .pack
. Этот файл пакета содержит фактические объекты git, а .idx
содержит индекс, используемый для быстрого поиска объектов в файле пакета.
$ git verify-pack -v .git/objects/pack/pack-7b03cc896f31b2441f3a791ef760bd28495697e6.idx
Приведенная выше команда читает указанный файл .idx
и проверяет это с помощью соответствующего файла пакета. Используя -v
, вы получите подробный вывод.
Третий столбец в выводе - это размер объектов. Используя sort -k 3 -n
, мы сортируем выходные данные численно, используя 3-й столбец (на основе размера), а с помощью 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 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
отсортировать численно по 4-му столбцу. tail
вырезать последние 10 элементов. awk
для вывода только 4-го и 5-го столбца из выходных данных.