Как найти N самых больших файлов в репозитории git? - PullRequest
32 голосов
/ 26 февраля 2012

Я хотел найти 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 -

Есть ли лучший / более элегантный способ сделать то же самое?в хранилище.

Ответы [ 6 ]

44 голосов
/ 28 февраля 2015

Я нашел другой способ сделать это:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4 | tail -n 10

Цитируется из: ТАК: git find fat commit

14 голосов
/ 29 февраля 2012

Как насчет

git ls-files | xargs ls -l | sort -nrk5 | head -n 10

git ls-files: List all the files in the repo
xargs ls -l: perform ls -l on all the files returned in git ls-files
sort -nrk5: Numerically reverse sort the lines based on 5th column
head -n 10: Print the top 10 lines
9 голосов
/ 07 сентября 2017

Этот 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

Первые четыре строки реализуют основные функциональные возможности, пятая ограничивает количество результатов, в то время как последние две строки предоставляют приятные удобочитаемый вывод , который выглядит следующим образом:

...
0d99bb931299  530KiB path/to/some-image.jpg
2ba44098e28f   12MiB path/to/hires-image.png
bd1741ddce0d   63MiB path/to/some-video-1080p.mp4

Для получения дополнительной информации, включая дальнейшую фильтрацию вариантов использования и формат вывода, более подходящий для обработки сценария, см. Мой оригинальный ответ к аналогичному вопросу.

3 голосов
/ 15 ноября 2017

Улучшение ответа рафинесс, сортировка по размеру с наибольшим первым:

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
1 голос
/ 27 февраля 2012

Вы также можете использовать du - Пример: du -ah objects | sort -n -r | head -n 10. du, чтобы получить размер объектов, sort их, а затем выбрать 10 лучших, используя head.

0 голосов
/ 13 апреля 2016

Вы можете использовать find, чтобы найти файлы, размер которых превышает заданное пороговое значение, а затем передать их в git ls-files, чтобы исключить неотслеживаемые файлы (например, выходные данные сборки):

find * -type f -size +100M -print0 | xargs -0 git ls-files

Отрегулируйте 100M (100 мегабайт) по мере необходимости, пока не получите результаты.

Незначительное предостережение: он не будет искать "скрытые" файлы и папки верхнего уровня (то есть те, чьи имена начинаются с .). Это потому, что я использовал find * вместо просто find, чтобы избежать поиска в базе данных .git.

У меня были проблемы с получением решений sort -n (в Windows под Git Bash). Я предполагаю, что это происходит из-за различий в отступах, когда аргументы xargs пакетируются, что, по-видимому, xargs -0 автоматически обходит ограничение длины командной строки Windows, равное 32767.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...