Как показать 10 самых больших элементов из истории git

Я нашел эту команду, чтобы получить 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

Что представляют собой эти цифры? Какой из них размер файла? Также я был бы очень признателен, если бы кто-нибудь смог сломаться и объяснить верхнюю команду. Я не понимаю этого.

5
задан 15 July 2020 в 01:41

2 ответа

Чтобы уменьшить пространство, используемое файлами, 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 packfiles

Git Internals - Packfiles

Git - поиск имени файла из SHA1

7
ответ дан 30 July 2020 в 22:07

Вот еще одно изящное решение этой проблемы с использованием подкоманды 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-го столбца из выходных данных.
0
ответ дан 30 July 2020 в 22:07

Другие вопросы по тегам:

Похожие вопросы: