Git Status требует много времени для завершения

85

Я использую gitдля управления файлами в локальном каталоге на машине с Windows - здесь не задействована сеть, я не нажимаю и не перетаскиваю на / с другой машины. В моем каталоге около 100 файлов, все тестовые файлы довольно маленькие. Когда я бегаю git status, это обычно занимает 20-30 секунд. Это нормально? Могу ли я что-нибудь сделать, чтобы ускорить его, или лучший способ узнать, в каком состоянии находится мой репозиторий (измененные файлы, неотслеживаемые файлы и т. Д.)? Другие gitкоманды, кажется, выполняются намного быстрее.

Мэтт Макминн
источник
Какую версию git вы используете? Пожалуйста, рассмотрите возможность обращения за помощью в группу Google msysGit или в список рассылки git (git [at] vger.kernel.org, вам не нужно подписываться), возможно, это ошибка в git.
Якуб Наребски,

Ответы:

129

Вы пробовали git gc ? Это убирает мусор из репозитория git.

Скотт
источник
3
Похоже, это сработало. Я очень удивлен, что всего после пары коммитов в репозитории будет столько всего, что можно очистить - спасибо!
Мэтт Макминн,
4
Хехе, я просто побежал с git statusпомощью timeкоманды и получил «реальное» время 30.464s. Затем я побежал git gcпотом time git statusеще раз и получил реальное время 35.409s. Довольно странно.
RyanScottLewis
14
Это зафиксировало меня с 33 секунд до менее 1 секунды для большинства моих репозиториев. Было бы неплохо, если бы Git сказал вам сделать это, когда вы дошли до этой точки. Я никогда не знал, что это нужно.
XP84
При запуске git statusнесколько раз подряд последующие запуски занимают лишь долю от первого. Таким образом, если вы работаете git status, а затем , git gcа затем git statusснова, он , как ожидается , он будет работать очень быстро.
kiewic
7

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

Я переместил вторичный репозиторий git в другое место, и теперь скорость высокая!

Сержант
источник
Добавляю аналогичную проблему. Что случилось, это сделал git init в подкаталоге. Проблема в том, что subdir как бы скрыт (вам нужно сделать git status внутри, чтобы увидеть изменения), но я думаю, что git все еще пытается их вычислить. Я игнорирую subdir, и теперь все в порядке.
mb14
6

Вы используете какое-то программное обеспечение для защиты от вирусов? Может быть, это что-то мешает. gitдля меня очень быстро работает на Windows с репозиториями из тысяч файлов.

1800 ИНФОРМАЦИЯ
источник
1
Да, работодатель разрешил использование TrendMicro OfficeScan. Я убил антивирусный сканер, те же результаты с git status.
Мэтт Макминн,
1
Другой вариант на эту тему - программное обеспечение для шифрования на лету, такое как Credant, которое может значительно замедлить работу вашего компьютера.
Дон Брэнсон,
Это было проблемой для меня. Убил антивирус Касперского и статус вернулся до <1 секунды.
Робин Уинслоу,
5

Пробовали перепаковывать? git-repack .

В противном случае попробуйте продублировать каталог и удалить папку .git в дублированном каталоге. Затем создайте новый каталог git и посмотрите, все ли работает медленно.

Если он все еще медленный, то это похоже на проблему с системой или оборудованием. Git завершает за меня статус сотен файлов менее чем за 5 секунд.

Thedz
источник
Repack вроде помог - после запуска запустил status, и он сразу вернулся. Однако я подождал несколько секунд и снова запустил статус, а это заняло 30 секунд. Я попытался продублировать каталог и получил ту же проблему.
Мэтт Макминн,
Хм, интересно. У вас есть внешний диск? Или флешку? Попробуйте скопировать репо и посмотрите, есть ли разница. Возможно, проблема с приводом, на котором он сейчас находится.
thedz
На флешке разницы нет.
Мэтт Макминн,
Это действительно странно. Все, что я могу сказать на данный момент, это то, что я не знаю. Вы можете попробовать скопировать свое репо и попробовать его на чужом компьютере - это должно, по крайней мере, сказать вам, является ли проблема локальной для вашей системы.
thedz
4

По какой-то причине git statusработает особенно медленно после перемещения или копирования папки репозитория в новое место.

Последующие запуски в этом случае обычно проходят быстрее.

DanJAB
источник
1
Есть ли способ избежать этой медлительности при первом запуске? Я попробовал git gc, но это не помогло. Это не проблема, так как это происходит только в первый раз после копирования файлов.
franksands
Я не знаю, как избежать начальной медлительности, но если бы была какая-то команда, которая могла бы это сделать, она, вероятно, выполняла бы то же самое, что и исходная git statusкоманда, поэтому, вероятно, для завершения потребуется такое же количество времени.
DanJAB
4

Мой git statusбыл очень медленным (до одной минуты), потому что глобальный .gitignoreфайл находился в моем профиле пользователя Windows, который хранился в недоступном сетевом ресурсе.

git config --global core.excludesfile
показал что-то вроде \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

По какой-то причине \\Nxxxx0был недоступен, и мой профиль пользователя был загружен из системы резервного копирования \\Nxxxxx1. Чтобы понять это, потребовалось некоторое время, потому что обычно мой пользовательский профиль привязан к букве диска с помощью сценария запуска предприятия, и доступ к этой букве диска работал как обычно. Я не уверен, почему git-config использовал общий сетевой ресурс, а не букву диска (вероятно, виноват я младший)

После настройки
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusвернулся к нормальной скорости.

Аригион
источник
3

git fsckРаньше бег решал эту проблему для меня.

Билл
источник
3

Для меня медлительность была связана с наличием большого количества неотслеживаемых файлов (временных и выходных файлов из сценариев). Запуск git status -uno, который исключает неотслеживаемые файлы, работает намного быстрее и соответствует моим требованиям.

МК Охотник
источник
1

Проблема для меня заключалась в том, что у меня было много разных репозиториев, клонированных на мой локальный жесткий диск, и чем больше у вас репозиториев, тем больше времени потребуется для выполнения таких команд, как git status.

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

Я не вижу здесь ответов, подобных этому.

Джек Перри
источник
1
Я не думаю, что это может git statusкаким-либо образом повлиять на стандарт, который вы используете в одном каталоге. Если ваши репозитории зарегистрированы в разных каталогах, вы можете запускать только git statusодин из них за раз. Другое дело, если ваши репозитории git перекрываются, но в любом случае это плохая идея.
Hubert Grzeskowiak
@HubertGrzeskowiak определенно может. Они были для меня повсюду в разных местах на моем жестком диске, но это сильно повлияло на время загрузки при вводе git status. После удаления повторяющихся репозиториев он сразу стал быстрее с нескольких минут до 5 секунд.
Джек Перри,
1

Еще один аспект, git statusкоторый будет улучшен (в Git 2.14.x / 2.15, Q4 2017), - это отображение игнорируемых файлов ( git status --ignored)

" git status --ignored", заметив, что каталог без отслеживаемого пути игнорируется, по-прежнему перечисляет все игнорируемые пути в каталоге, что не является необходимым.
Кодовый путь был оптимизирован, чтобы избежать этих накладных расходов.

См. Commit 5aaa7fd (18 сентября 2017 г.) Джеймсон Миллер ( jamill) .
(Объединено Junio ​​C Hamano - gitster- в коммите 075bc9c , 29 сентября 2017 г.)

Улучшить производительность git status --ignored

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

Для примера разницы в производительности на примере репозитория с 196000 файлов в 400 игнорируемых каталогах:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

Дополнительные улучшения (установленные в Git 2.17, Q2 2018) см. В этом ответе .

VonC
источник
Совершенно случайный пример: node_modulesэто изменение производительности может повлиять на него. Просто возможно.
Сет Баттин
1

Более старые версии git имеют проблемы с производительностью с git status - дополнительные сведения см. В разделе Способы повышения производительности git status .

В git 2.13 есть одно исправление и еще 2.17. Я перешел с 2.7 на 2.23, и это разрешило медленный статус. В ближайшее время планируется еще одно улучшение для версии 2.24.

Бретт
источник
0

В моем случае медлительность была вызвана тем, что я работал git statusпод другим пользователем, а не владельцем файлов в проекте.

Хотя это применимо не во всех случаях, простое chownрешение для текущего пользователя может помочь.

Царь Пино
источник
-13

Попробуйте начать со свежего клона вашей кассы.

git clone myrepo mynewrepo

а затем выполните git status в mynewrepo.

В качестве альтернативы, и если вы смелее, вычистите мусор со своей существующей кассы.

git clean -dfx

Это избавляет git от необходимости сканировать некоторые (возможно, большие) наборы игнорируемых или незарегистрированных файлов.

Алекс Браун
источник
Я не думаю, что удаление всех игнорируемых файлов (что делает git clean) поможет, он уже игнорирует их. Скорее всего, запуск git clean удалит все ваши файлы конфигурации и т. Д. И эту команду нельзя отменить. Повторное клонирование (сначала сохранение вашего старого репозитория на случай, если оно вам понадобится) намного лучше, чем запуск git clean, и имеет тот же эффект.
XP84
5
Я не согласен с этим ответом, запуск git clean -dfx может что-то сломать.
Марсель Вальдес Ороско