Подтвердить что ты не робот

Как найти N наибольших файлов в репозитории git?

Я хотел найти 10 самых больших файлов в моем репозитории. script Я придумал следующее:

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 -

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

Под "файлами" я подразумеваю файлы, которые были проверены в репозитории.

4b9b3361

Ответ 2

Этот bash "однострочный" отображает 10 самых больших блоков в репозитории, отсортированных от самых маленьких до самых больших. В отличие от других ответов, это включает в себя все файлы, отслеживаемые репозиторием, даже те, которые не присутствуют в контенте ветки.

Это очень быстро, легко копировать и вставлять и требует только стандартных утилит 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

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

Ответ 3

Как насчет

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Вы можете использовать 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.

Ответ 7

Не могу комментировать. ypid ответ изменен для powershell

git ls-tree -r -l --abbrev --full-name HEAD | Sort-Object {[int]($_ -split "\s+")[3]} | Select-Object -last 10