2010-06-16 2 views
78

Мой проект составляет шесть месяцев, а git очень медленный. Мы отслеживаем около 30 файлов размером от 5 МБ до 50 МБ. Это двоичные файлы, и мы храним их в git. Я считаю, что эти файлы делают git медленными.git очень медленный при отслеживании больших двоичных файлов

Есть ли способ убить все файлы размером> 5 МБ из репозитория. Я знаю, что потеряю все эти файлы, и все в порядке со мной.

В идеале мне нужна команда, которая будет перечислять все большие файлы (> 5 МБ). Я вижу список, а затем я говорю, хорошо, продолжайте и удалите эти файлы и сделайте git быстрее.

Следует отметить, что git работает не только на моей машине, но и развертывание приложения в промежуточной среде теперь занимает около 3 часов.

Таким образом, исправление должно быть чем-то, что повлияет на сервер, а не только на пользователей репозитория.

+3

Вы можете попробовать использовать Git из 'ГИТ-bigfiles' проекта –

+1

вы можете захотеть попробовать использовать что-то вроде мерзавца-приложения для управления бинарными файлами. http://git-annex.branchable.com/ –

+0

В случае, если это полезно для всех, позвольте мне добавить, что моя версия Cygwin git висела на скидках. Когда я использовал Git-Bash, у того же репозитория не было проблем. –

ответ

-2

Просто установите файлы для игнорирования. Смотрите ссылку ниже:

http://help.github.com/git-ignore/

+1

Они уже добавлены. Игнорирование их ничего не сделает. – Cascabel

+0

@Jefromi на самом деле, если вы посмотрите на ссылку, которую я разместил, вы увидите, что во втором абзаце есть инструкции, говорящие ему точно, что делать в этом случае. – joshlrogers

+14

Правда. Но прямое содержание вашего ответа - «игнорировать файлы», а не «удалять файлы из отслеживания, а затем игнорировать их». Обычно лучше писать его здесь, чем ссылаться на другой сайт. – Cascabel

4

вы сказали мерзавца эти файлы являются бинарными?

например. добавлено *.ext binary в ваш репозиторий. .gitattributes

+0

Я предполагаю, что рассказывать git о том, что файлы двоичные скорости. –

+0

это может быть, если эвристика git не может сказать, что файл является двоичным автоматически. – sml

116

Собирать ли мусор?

git gc 

Это делает существенную разницу в скорости даже для небольших репозиториев.

+8

Это делается автоматически, когда становится слишком много беспорядка. Я сомневаюсь, что это действительно поможет OP. – Cascabel

+0

@Jefromi, это что нового? Я только что обновил до 1.7.1 вчера, но до этого версия, которую я использовал, определенно не запускала автоматически 'gc'. – kubi

+0

@kubi: Ну, это не было навсегда, но это не совсем новое - он был вызван из commit, merge, am и rebase с caf9de2 (Sep 14 2007) или в стабильной версии v1.5.4 (февраль 1 2008). – Cascabel

75

Объяснение

Git действительно хорош в огромных историй небольших текстовых файлов, так как он может хранить их и их изменения эффективно. В то же время git очень плохо работает в двоичных файлах и наивно хранит отдельные копии файла (by default, at least). Репозиторий становится огромным, а затем он замедляется, как вы уже заметили.

Это распространенная проблема среди DVCS, усугубляемая тем, что каждый раз, когда вы клонируете, вы загружаете каждую версию каждого файла («весь репозиторий»). Ребята в Kiln работают над плагином, чтобы обрабатывать эти большие файлы, похожие на Subversion, который загружает только исторические версии по запросу.

Решение

Эта команда выводит список всех файлов в текущем каталоге размером> = 5 МБ.

find . -size +5000000c 2>/dev/null -exec ls -l {} \; 

Если вы хотите удалить файлы из всей истории репозитория, вы можете использовать эту идею с git filter-branch ходить историю и избавиться от всех следов больших файлов. После этого все новые клоны репозитория будут более компактными. Если вы хотите приспособить репозиторий без клонирования, вы найдете указания на man page (см. «Контрольный список для сокращения репозитория»).

git filter-branch --index-filter \ 
    'find . -size +5000000c 2>/dev/null -exec git rm --cached --ignore-unmatch {} \;' 

Слово предупреждения: это сделает ваше хранилище несовместимыми с другими клонами, потому что деревья и индексы имеют различные файлы проверяются в; вы больше не сможете оттолкнуться от них.

+4

Примечание: это версия поиска Unix/Linux, а не Windows find.exe. –

+1

+1. Можете сначала отправить вывод 'find' в файл, проверить список, а затем использовать' git rm', на всякий случай, если будут какие-либо ложные удары. В качестве альтернативы, проверьте «git status» после удаления больших файлов и используйте 'git checkout HEAD ', чтобы вернуть любые ошибочно удаленные файлы. – Cascabel

+1

Я думаю, что ваш комментарий, что git «хранит отдельные копии по умолчанию», находится назад. Согласно цепочке электронной почты, которую вы по умолчанию связывали с (http://thread.gmane.org/gmane.comp.version-control.git/146957/focus=147598), git _tries_ для разграничения двоичных файлов - и это то, что вызвав проблему; а не хранилище. –

-24

Это потому, что git не масштабируется.

Это серьезное ограничение в git, которое было заглушено защитой git. Найдите списки рассылки git, и вы обнаружите, что сотни пользователей задаются вопросом, почему просто скудные 100 МБ изображений (скажем, для веб-сайта или приложения) приносят git на колени. Проблема заключается в том, что почти все git полагаются на оптимизацию, которую они называют «упаковкой». К сожалению, упаковка неэффективна для всех, кроме самых маленьких текстовых файлов (то есть исходного кода). Хуже того, он растет все меньше и меньше, поскольку история возрастает.

Это действительно смущающий недостаток в git, который рекламируется как «быстрый» (несмотря на отсутствие доказательств), и разработчики git хорошо знают об этом. Почему они не исправили это? Вы найдете ответы на список рассылки git от разработчиков git, которые не узнают проблему, потому что документы Photoshop (* .psd) являются проприетарным форматом. Да, это действительно так плохо.

Вот результат:

Используйте мерзавец для крошечных исходного кода только для проектов, которые вы не чувствуете, как создание отдельной репо. Или для небольших проектов с исходным кодом, где вы хотите воспользоваться моделью децентрализованного развития копии-полного-репо. Или когда вы просто хотите изучить новый инструмент. Все это является веским основанием для использования git, и всегда интересно изучать новые инструменты.

Не используйте git, если у вас есть большая база кода, двоичные файлы, огромная история и т. Д. Только одно из наших РЕПО - это ТБ. Гит не справляется с этим. VSS, CVS и SVN отлично справляются с этим. (SVN раздувается вверх.)

Также дайте git время для созревания. Он все еще незрелый, но он имеет большой импульс. Со временем я думаю, что практический характер Linus преодолеет пуристов OSS, и git в конечном итоге будет использоваться в большей области.

+15

Этот ответ действительно чрезмерно отрицательный и воспалительный. Да, git имеет проблемы с масштабируемостью * с бинарными файлами *. Он довольно масштабируемый и быстрый для кода. Есть много свидетельств скорости (несмотря на ваше утверждение, наоборот), даже не обращая внимания на то, что CVS/SVN требует доступа к сети, а не доступа к диску для многих операций. Есть много больших проектов с огромными историями, довольно счастливо использующими git. – Cascabel

+8

И ... твоя арфистка на фотошопе? Я не собираюсь тратить время на написание подробного ответа, но если прочитать весь поток http://thread.gmane.org/gmane.comp.version-control.git/146957/focus=147598 (возможно, re annoyed, потому что Джон в этом потоке?), я вижу много разумных ответов о том, как лучше всего справиться с этим с нынешним git, как он может быть рассмотрен в будущем и почему это не их первый приоритет. – Cascabel

+14

Да, я не думаю, что ты прав, здесь. Git работает слишком хорошо для ядра Linux, чтобы заслужить пренебрежение, «не масштабируется». –

17

Вот цензура пересмотр предназначен, чтобы быть менее отрицательными и воспалительными:

Git имеет хорошо известную слабость, когда речь идет о файлах, которые не выравнивает построчно текстовые файлы. В настоящее время нет решения, и никакие планы, объявленные основной командой git для решения этой проблемы. Возможны временные решения, если ваш проект небольшой, скажем, 100 МБ или около того. Существуют ветви проекта git для решения этой проблемы масштабируемости, но в настоящее время эти ветви не являются зрелыми. Некоторые другие системы контроля версий не имеют этой конкретной проблемы. Вы должны рассматривать эту проблему как один из многих факторов при принятии решения о выборе git в качестве вашей системы контроля версий.

+7

«У Git есть известная слабость ...» - – Nav

+6

Я знаю это. которому нужны котировки, когда его фактические общие знания. просто не используйте git для двоичного кода. использовать perforce или специализированное управление активами. –

+1

@ v.oddou Ну, есть разница между «Я знаю это» и «его фактическим общим знанием». Дело в том, что не все это знают и, вероятно, это даже не совсем так. Поэтому любая цитата улучшает этот ответ. Это нормально, но, безусловно, не выдающийся и подкрепленный. – Trilarion

1

Я работаю с Git с 2008 года как на окнах, так и на GNU/linux, и я большую часть файлов, которые я отслеживаю, это двоичные файлы. Некоторые из моих репозиториев - несколько GB и содержат Jpeg и другие медиа. У меня много компьютеров как дома, так и на работе, работающей с Git.

У меня никогда не было симптомов, описанных в исходном посте. Но всего пару недель назад я установил MsysGit на старый ноутбук Win-XP и почти все, что я сделал, он остановил git. Даже тест с двумя или тремя небольшими текстовыми файлами был смехотворно медленным. Мы говорим о 10 минутах, чтобы добавить файл меньше, чем 1k ... похоже, что git-процессы оставались живыми навсегда. Все остальное работало, как ожидалось, на этом компьютере.
Я отказался от последней версии до версии 1.6, и проблемы были упущены ...
У меня есть другие ноутбуки того же бренда, также с Win-XP, установленным одним и тем же отделом ИТ, с тем же изображением, где Git отлично работает независимо от версии ... Так что с этим конкретным компьютером должно быть что-то странное.

Я также провел несколько тестов с бинарными файлами и сжатием. Если у вас есть BMP-изображение, и вы вносите небольшие изменения в него и совершаете их, git gc сжимается очень хорошо. Итак, я пришел к выводу, что сжатие не зависит от того, являются ли файлы двоичными или нет.

13

Нет ничего особенного в бинарных файлах и способах, которыми git обрабатывает их. Когда вы добавляете файл в репозиторий git, заголовок добавляется и файл сжимается zlib и переименовывается после хэша SHA1. Это точно так же, независимо от типа файла. В zlib-сжатии нет ничего плохого в двоичных файлах.

Но в некоторых точках (нажатие, gc) Git начинает смотреть на возможность дельта-сжатия содержимого. Если git находит файлы, похожие (имя файла и т. Д.), Он помещает их в ОЗУ и начинает сжимать их вместе. Если у вас есть 100 файлов, и каждый из них скажет 50 Мб, он попытается поместить 5 ГБ в память одновременно. Для этого вам нужно добавить еще кое-что, чтобы все работало. У вашего компьютера может не быть такого объема оперативной памяти, и он начинает меняться. Процесс требует времени.

Вы можете ограничить глубину дельта-сжатия, чтобы процесс не использовал столько памяти, но результат был менее эффективным. (core.bigFileThreshold, delta attribute, pack.window, pack.depth, pack.windowMemory и т. д.)

Итак, есть много идей, которые вы можете сделать, чтобы git отлично работал с большими файлами.

+4

См. [Здесь] (http://thread.gmane.org/gmane.comp.version-control.git/146957/focus=147598) для объяснения того, как отключить эти попытки «дельта». –

5

Одним из способов ускорения действий является использование флага --depth 1. См. Справочную страницу. Я не великий гут-гуру, но я считаю, что это говорит о эквиваленте p4 get или svn get, то есть он дает вам только последние файлы, а не «дайте мне все изменения всех файлов за все время», что и есть git clone.

+1

Это не позволяет вам выталкивать из хранилища, поэтому он имеет ограниченную полезность. –

Смежные вопросы