У меня есть 300 МБ GIT-репо. Общий размер моих извлеченных файлов составляет 2 МБ, а общий размер остальной части репозитория git - 298 МБ. По сути, это репо с кодом, размер которого не должен превышать нескольких МБ.
Я подозреваю, что кто-то случайно передал некоторые большие файлы (видео, изображения и т. Д.), А затем удалил их ... но не из git, поэтому история по-прежнему содержит бесполезные большие файлы. Как найти большие файлы в истории git? Есть более 400 коммитов, так что идти один за другим непрактично.
ПРИМЕЧАНИЕ : мой вопрос не о том, как удалить файл , а о том, как его найти .
Ответы:
Я нашел этот скрипт очень полезным в прошлом для поиска больших (и неочевидных) объектов в репозитории git:
Это даст вам имя объекта (SHA1sum) большого двоичного объекта, а затем вы можете использовать такой скрипт:
... чтобы найти коммит, который указывает на каждый из этих BLOB-объектов.
источник
Fast Чертовски быстрый однострочный корпус 🚀
Этот сценарий оболочки отображает все объекты BLOB-объектов в хранилище, отсортированные от наименьшего к наибольшему.
Для моего примера репо он работал примерно в 100 раз быстрее, чем другие, найденные здесь.
В моей надежной системе Athlon II X4 она обрабатывает репозиторий ядра Linux с 5,6 миллионами объектов всего за минуту .
Базовый сценарий
Когда вы запустите код выше, вы получите хороший читабельный вывод, подобный этому:
пользователи macOS : поскольку
numfmt
в macOS это невозможно, вы можете либо пропустить последнюю строку и работать с необработанными байтами, либоbrew install coreutils
.фильтрация
Для дальнейшей фильтрации вставьте любую из следующих строк перед
sort
строкой .Чтобы исключить файлы, присутствующие в
HEAD
, вставьте следующую строку:к показать только файлы, размер которых превышает заданный размер (например, 1 МБ = 2 20 Б), вставьте следующую строку:
Выход для компьютеров
Для генерации выхода это более подходящий для дальнейшей обработки компьютерами, пропустите две последние строки базового сценария. Они делают все форматирование. Это оставит вас с чем-то вроде этого:
Удаление файла
Для фактического удаления файла, проверьте этот SO вопрос по теме .
источник
brew install coreutils
а затем заменитьcut
наgcut
иnumfmt
сgnumfmt
.git large
кто-нибудь?Я нашел однострочное решение на вики-странице ETH Zurich Department of Physics (ближе к концу этой страницы). Просто сделайте,
git gc
чтобы удалить несвежий мусор, а затемдаст вам 10 самых больших файлов в хранилище.
Также доступно более ленивое решение, в GitExtensions теперь есть плагин, который делает это в пользовательском интерфейсе (а также обрабатывает переписывание истории).
источник
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Шаг 1 Запишите все файлы SHA1 в текстовый файл:
Шаг 2 Сортировка больших двоичных объектов с самых больших на маленькие и запись результатов в текстовый файл:
Шаг 3a Объедините оба текстовых файла, чтобы получить информацию об имени файла / sha1 / size:
Шаг 3b Если у вас есть имена файлов или пути, содержащие пробелы, попробуйте этот вариант шага 3a. Используется
cut
вместо того,awk
чтобы получить нужные столбцы вкл. пробелы от столбца 7 до конца строки:Теперь вы можете посмотреть файл bigtosmall.txt, чтобы решить, какие файлы вы хотите удалить из своей истории Git.
Шаг 4 Чтобы выполнить удаление (обратите внимание, что эта часть медленная, так как она собирается проверять каждый коммит в вашей истории на предмет данных о файле, который вы идентифицировали):
Источник
Шаги 1-3a были скопированы из поиска и очистки больших файлов из истории Git
РЕДАКТИРОВАТЬ
Статья была удалена где-то во второй половине 2017 года, но к ее архивной копии все еще можно получить доступ с помощью Wayback Machine .
источник
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Обратите внимание, что после вводаjoin -t'
CTRL + V <TAB> необходимо ввести фактический символ табуляции в geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html$'\t'
должен дать вам вкладку.echo -n $'\t' | xxd -ps
->09
Вы должны использовать BFG Repo-Cleaner .
По данным сайта:
Классическая процедура для уменьшения размера хранилища будет:
источник
--strip-biggest-blobs 500
?Если вы хотите иметь только список больших файлов, я хотел бы предоставить вам следующую однострочную строку:
Чей вывод будет:
Последняя запись в списке указывает на самый большой файл в вашей истории git.
Вы можете использовать этот вывод, чтобы гарантировать, что вы не удаляете вещи с BFG, которые вам понадобились бы в вашей истории.
источник
1.1, 1.2, 2.3
цифры?<filenumber>.<field>
указывающий порядок комбинации. Смотрите man.cx/join для получения дополнительной информации.Если вы работаете в Windows, вот скрипт PowerShell, который напечатает 10 самых больших файлов в вашем хранилище:
источник
You cannot call a method on a null-valued expression. At line: 2 char: 1
. Однако этот ответ сработал: stackoverflow.com/a/57793716/2441655 (он также короче)Пытаться
git ls-files | xargs du -hs --threshold=1M
.Мы используем приведенную ниже команду в нашем конвейере CI, она останавливается, если находит в git-репозитории большие файлы:
источник
Я не смог использовать самый популярный ответ, потому что
--batch-check
переключатель командной строки для Git 1.8.3 (который я должен использовать) не принимает никаких аргументов. Последующие шаги были опробованы на CentOS 6.5 с Bash 4.1.2Ключевые идеи
В Git термин blob подразумевает содержимое файла. Обратите внимание, что фиксация может изменить содержимое файла или пути. Таким образом, один и тот же файл может ссылаться на другой BLOB-объект в зависимости от фиксации. Определенный файл может быть самым большим в иерархии каталогов в одном коммите, а не в другом. Поэтому вопрос поиска больших коммитов вместо больших файлов ставит вопросы в правильном ракурсе.
Для нетерпеливых
Команда для печати списка больших двоичных объектов в порядке убывания размера:
Пример вывода:
Чтобы удалить такие капли, используйте BFG Repo Cleaner , как указано в других ответах. Имеется файл,
blobs.txt
который содержит только хэши больших двоичных объектов, например:Делать:
Вопрос в том, чтобы найти коммиты, а это больше работы, чем поиск блобов. Чтобы узнать, пожалуйста, читайте дальше.
Дальнейшая работа
С учетом хэша коммита команда, которая печатает хэши всех объектов, связанных с ним, включая большие двоичные объекты:
Таким образом, если у нас есть такие выходные данные, доступные для всех коммитов в репо, то с учетом хэша большого двоичного фрагмента, те коммиты, которые соответствуют любому из выходных данных. Эта идея закодирована в следующем сценарии:
Если содержимое сохранено в файле с именем,
find-commits.sh
типичный вызов будет выглядеть так:Как и ранее, в файле
blobs.txt
перечислены хэши BLOB-объектов, по одному на строку.create_db()
Функция сохраняет кэш всех фиксации списков в подкаталог в текущем каталоге.Немного статистики из моих экспериментов на системе с двумя процессорами Intel (R) Xeon (R) CPU E5-2620 2,00 ГГц, представленной ОС как 24 виртуальных ядра:
Обратите внимание, что скрипт является однопоточным. Следовательно, только одно ядро будет использоваться одновременно.
источник
Решение Powershell для Windows Git, найти самые большие файлы:
источник
Начните с анализа, проверки и выбора основной причины. Используйте,
git-repo-analysis
чтобы помочь.Вы также можете найти некоторую ценность в подробных отчетах, сгенерированных BFG Repo-Cleaner , которые можно очень быстро запустить путем клонирования в каплю Digital Ocean с использованием пропускной способности сети 10 МБ / с.
источник
Я наткнулся на это по той же причине, что и все остальные. Но приведенные сценарии не совсем сработали для меня. Я сделал один, который является более гибридным из тех, что я видел, и теперь он живет здесь - https://gitlab.com/inorton/git-size-calc
источник