Я запускаю эту команду из Почему мой репозиторий git такой большой? в очень большом git
репозитории как https://github.com/python/cpython.
git rev-list --all --objects | sed -n $(git rev-list --objects --all | cut -f1 -d' ' | git cat-file --batch-check | grep blob | sort -n -k 3 | tail -n800 | while read hash type size; do size_in_kibibytes=$(echo $size | awk '{ foo = $1 / 1024 ; print foo "KiB" }'); echo -n "-e s/$hash/$size_in_kibibytes/p "; done) | sort -n -k1;
Он отлично работает, если я заменю tail -n800
на tail -n40
:
1160.94KiB Lib/ensurepip/_bundled/pip-8.0.2-py2.py3-none-any.whl
1169.59KiB Lib/ensurepip/_bundled/pip-8.1.1-py2.py3-none-any.whl
1170.86KiB Lib/ensurepip/_bundled/pip-8.1.2-py2.py3-none-any.whl
1225.24KiB Lib/ensurepip/_bundled/pip-9.0.0-py2.py3-none-any.whl
...
Я нашел этот вопрос Bash: аргументы sed -n, в котором говорилось, что я могу использовать awk
вместо sed
.
Вы знаете, как исправить это sed: Argument list too long
, когда tail
это -n800
вместо -n40
?
Вы можете увидеть ошибку, просто клонировав репозиторий cpython, указанный в вопросе, и выполнив команду в клонированном репозитории. В вопросе также есть пример вывода, когда хвост -n800
заменяется хвостом -n40
Причина, по которой вы получаете эту ошибку, заключается в том, что вы пытаетесь передать sed
больше аргументов, чем поддерживает ваша система.
В качестве альтернативы проверьте, будет ли работать git sizer
в вашем репозитории: это поможет изолировать то, что происходит в вашем репозитории.
Если нет, у вас есть другие команды в «Как найти/идентифицировать большие коммиты в истории git?», которые зацикливаются на каждом объекте и избегают части sed -nxx
Альтернативой может быть перенаправление вашего результата/команды в файл, а затем sed в этом файле, как здесь.
Кажется, вы использовали этот ответ в связанном вопросе: Некоторые скрипты, которые я использую:.... В этом ответе есть красноречивый комментарий:
This function is great, but it's unimaginably slow. It can't even finish on my computer if I remove the 40 line limit. FYI, I just added an answer with a more efficient version of this function. Check it out if you want to use this logic on a big repository, or if you want to see the sizes summed per file or per folder. – piojo Jul 28 '17 at 7:59
И, к счастью, у piojo есть написал другой ответ для решения этой проблемы. Просто используйте его код.
Я хотел бы однострочник только для быстрого копирования и вставки.
Вы можете адаптировать псевдоним в связанном ответе.
Если вы опубликуете свои данные и то, что хотите из них получить, мы можем помочь сократить эту длинную строку команд. Все, что делается с помощью
cut
,grep
,sed
,sort
,tail
,print
иawk
, можно сделать с помощью всего одногоawk