Медленные операции Git - PullRequest
5 голосов
/ 12 марта 2012

У меня есть тестовый репозиторий, который я помещаю под Git. Большинство файлов довольно крошечные, но их очень много, и просто операции Git, такие как add и status, завершаются за десятки минут. Каковы мои варианты, чтобы поставить их под контроль версий и получить разумную производительность? Стоит ли пытаться использовать субмодули или держаться подальше от DVCS?

Ответы [ 2 ]

13 голосов
/ 12 марта 2012

Операции Git, такие как add и status, требуют stat каждый файл в файловой системе (для обнаружения изменений).Либо у вас действительно огромное количество файлов (скажем, десятки или сотни тысяч файлов), либо у вас есть файловая система с довольно медленной stat операцией.

В любом случае, если вам нужноДля работы в системе, где это происходит очень медленно, вы можете использовать бит «предположить неизменным» в индексе, который говорит Git не беспокоить файл stat.Если вы включите это, вам нужно вручную дать команду git забрать изменения в отдельных файлах, например, передав их непосредственно в git add, иначе Git даже не узнает, что что-то изменилось.Вы можете включить это, установив git config core.ignoreStat true, а затем запустив что-то вроде git reset --hard HEAD.

7 голосов
/ 12 марта 2012

Интересно, что здесь за «очень большое» число? Обычно это мешает не количество маленьких файлов, а большие двоичные файлы. Тем не менее, я могу себе представить, что если количество достаточно велико, вы бы хотели разделить их на несколько репозиториев - либо с помощью субмодулей, либо каким-либо другим способом. Если они должны находиться в одном репо, вы можете найти, например, Subversion более производительным.

РЕДАКТИРОВАТЬ: хорошо, так что вы добавили в качестве комментария, что вы используете монтирование NFS, которое звучит как возможное узкое место здесь. Пожалуйста, проверьте решения по этому вопросу в этой теме . Особенно интересен core.preloadindex.

С документация :

core.preloadindex

Включить предварительную загрузку параллельного индекса для таких операций, как git diff

Это может ускорить такие операции, как git diff и git status, особенно на файловых системах, таких как NFS, которые имеют слабую семантику кэширования и, следовательно, относительно высокие задержки ввода-вывода. Если для этого параметра установлено значение true, git сделает параллельное сравнение индекса с данными файловой системы, что позволяет перекрывающиеся операции ввода-вывода.

EDIT2: в комментариях упоминалось 6 миллионов файлов. Я могу понять, что это становится узким местом - это действительно очень большое количество.

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