Git Bash очень медленно работает на Windows 7 x64

341

Я использовал Git как для Windows, так и для Ubuntu во время разработки небольшого проекта, часто переворачиваясь между ними. Проблема, с которой я сталкиваюсь, заключается в том, что Git/Bash последовательно замедляется. Когда я говорю медленно, я имею в виду, что запуск cd занимает от 8 до 25 секунд, выполнение команд git занимает от 5 до 20 секунд, а ls может занимать до 30 секунд. Излишне говорить, что это не весело, не говоря уже о непродуктивных. Я знаю, что Git работает медленнее в Windows, но это смешно.

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

До сих пор я пробовал:

  • Добавление Git и папки проекта в список исключений антивирусного сканера
  • Полностью отключить мой антивирус (Kaspersky IS 2011)
  • Обеспечение того, что Outlook не запущен (Outlook 2007)
  • Выключение всех других приложений
  • Запуск Git в качестве администратора
  • Отключение сетевого подключения, запуск git и запрет на соединение.
  • Отключение сетевого подключения, запуск git, повторное включение соединения (работает только изредка)
  • Запуск Git gc
  • И комбинации указанных выше

Я прочитал, что у пары людей было успешное завершение завершения bash, но в идеале я хотел бы сохранить этот актив. Версия msysgit - это 1.7.3.1-preview20101002, а ОС - Windows 7 x64. Запуск таких же функций в Linux, как ожидается, будет молниеносно. Я бы использовал Linux исключительно, но мне тоже нужно запускать файлы в Windows (некоторые приложения, тестирование и т.д.).

Кто-нибудь сталкивался с подобной проблемой? Если да, то в чем была основная проблема и каково было решение (если оно есть)?

Изменить: это распространяется только на репозитории Git, но только для справки, репозиции, которые я использовал Git, были довольно маленькими: ~ 4-50 файлов максимум.

  • 0
    Не отчаивайтесь, но Cygwin очень медленно работает на x64, лучше попробуйте на Windows XP 32bit.
  • 1
    Возможный дубликат Msysgit bash ужасно медленный в Windows 7
Показать ещё 5 комментариев
Теги:
windows-7
mingw32
msysgit

19 ответов

13
Лучший ответ

Похоже, что полное удаление Git, перезапуск (классическая обработка Windows) и переустановка Git - это лечение. Я также уничтожил все файлы конфигурации bash, которые были оставлены (они были созданы вручную). Все снова быстро.

Если по какой-то причине переустановка невозможна (или желательно), я бы определенно попытался изменить переменную PS1, на которую ссылается ответ Криса Долана; это привело к значительному ускорению в определенных операциях.

  • 3
    Переустановка без перезапуска не сработала, деинсталляция-перезапуск-установка сработала. Спасибо! Было бы неплохо знать, почему и как bash стал таким медленным.
  • 0
    Переустановка с промежуточной перезагрузкой для меня не имела значения.
Показать ещё 7 комментариев
360

Вы можете значительно ускорить git в Windows, выполнив три команды, чтобы установить некоторые параметры конфигурации:

$ git config --global core.preloadindex true
$ git config --global core.fscache true
$ git config --global gc.auto 256

Примечания:

  • core.preloadindex Операции файловой системы параллельны, чтобы скрыть латентность (обновление: включено по умолчанию в git 2.1)

  • core.fscache исправляет проблемы UAC, поэтому вам не нужно запускать git в качестве администратора (обновление: включено по умолчанию в git для Windows 2.8)

  • gc.auto минимизирует количество файлов в .git/

  • 5
    Похоже, тот, который работает магия это core.fscache
  • 0
    Мне не помогло, но помогло экспорт PS1 = '$', упомянутый ниже. Так что я знаю для меня проблема заключается в терминальной линии.
Показать ещё 7 комментариев
71

У вас есть Git информация, отображаемая в вашей приглашении Bash? Если это так, возможно, вы неохотно делаете слишком много работы над каждой командой. Чтобы проверить эту теорию, попробуйте следующее временное изменение в Bash:

export PS1='$'
  • 1
    После внесения этого изменения смена каталогов стала мгновенной операцией, а значение ls уменьшилось до примерно 6 секунд. Git также заметно быстрее, например, до 6 секунд для branch и status , вместо 10-15 секунд.
  • 2
    @ Близнецы14 - Хорошо. Это означает, что ваша оболочка Bash была настроена на выполнение чрезмерной работы в командной строке. Вы хотите настроить свой ~ / .bashrc или ~ / .login, чтобы сделать изменение постоянным. Тем не менее, 6 секунд ls сумасшедший медленный, так что с вашей машиной все еще что-то не так. Я рекомендую поиграть с некоторыми инструментами SysInternals на вашем компьютере с Windows, чтобы посмотреть, какие файлы открываются. technet.microsoft.com/en-us/sysinternals/default
Показать ещё 16 комментариев
61

Мой домашний каталог Windows находится в сети, и я подозревал, что команды Git Bash там смотрят в первую очередь. Разумеется, когда я посмотрел на $PATH, он сначала перечислил /h/bin, где/h - общий ресурс на файловом сервере Windows, хотя /h/bin не существует. Я отредактировал /etc/profile и закомментировал команду экспорта, которая помещает ее сначала в $PATH:

#export PATH="$HOME/bin:$PATH"

Это заставило мои команды работать намного быстрее, возможно, потому что Git Bash больше не ищет сеть для исполняемых файлов. Мой /etc/profile был c:\Program Files (x86)\Git\etc\profile.

  • 6
    Я была такая же проблема. Я изменил HOME="$(cd "$HOME" ; pwd)" на HOME="$(cd "$USERPROFILE" ; pwd)" , и теперь все происходит невероятно быстро. Спасибо за чаевые.
  • 2
    Я успешно использовал вариант этого: в профиле принудительно $ HOME для $ USERPROFILE, удалив ссылку $ HOMEDRIVE. Также в свойствах ярлыка Git Bash установите для параметра «Начать с» значение% USERPROFILE%
Показать ещё 5 комментариев
20

Я обнаружил, что сетевой диск является проблемой производительности. HOME указывал на медленную долю сети. Я не мог переопределить HOMEDRIVE, но это не проблема из того, что я видел.

Установите переменную окружения, щелкнув правой кнопкой мыши ваш компьютер на рабочем столе → свойства → Расширенные настройки системы → Переменные среды Добавить в раздел "Пользовательские переменные"

HOME=%USERPROFILE%
  • 3
    Это сработало. Для всех, у кого есть проблемы с сетью, это реальное решение. Вам не нужно редактировать какой-либо конфигурационный файл, просто укажите HOME, где это необходимо.
  • 0
    Определение пользователя Env Var HOME как% USERPROFILE% не работает. Я определил SYSTEM VAR: HOME = C: \ Users \ myUserName
19

В то время как ваша проблема может быть связана с сетью, я лично ускорил свои локальные вызовы git status в десять раз (7+ секунд до 700 мс), выполнив две модификации. Это на 700 мб репо с 21 000 файлов и избыточным количеством больших двоичных файлов.

Один из них обеспечивает параллельные предварительные загрузки индекса. Из командной строки:
git config core.preloadindex true
Это изменило time git status с 7 секунд до 2,5 секунд.

Обновление!

Больше не требуется. Патч исправил это как mysysgit 1.9.4
https://github.com/msysgit/git/commit/64d63240762df22e92b287b145d75a0d68a66988
Однако вы должны включить исправление, набрав git config core.fscache true

Я также отключил UAC и драйвер "luafv" (требуется перезагрузка). Это отключает драйвер в Windows Vista, 7 и 8, который перенаправляет программы, пытающиеся записать в системные местоположения, и вместо этого перенаправляет эти обращения в каталог пользователя.

Чтобы узнать, как это влияет на производительность git, читайте здесь: https://code.google.com/p/msysgit/issues/detail?id=320

Чтобы отключить этот драйвер, в regedit измените "стартовый" ключ с HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv на 4, чтобы отключить драйвер. Затем установите UAC в самую низкую настройку, "никогда не уведомляйте".

Если отключение этого драйвера делает вас настороженным (оно должно), альтернатива выполняется на диске (или разделе), отличном от вашего системного раздела. Видимо, драйвер работает только с доступом к файлу на системном разделе. У меня есть второй жесткий диск и вижу идентичные результаты при запуске с этой модификацией реестра на моем диске C, как и без него на диске D.

Это изменение занимает time git status с 2,5 секунд до 0,7 секунды.

Вы также можете захотеть следовать https://github.com/msysgit/git/pull/94 и https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b, чтобы узнать, какая дополнительная работа в настоящее время ведется работа по вопросам скорости в Windows.

  • 7
    это лишь еще раз выявляет идиотизм и изнурительные решения Microsoft, а также проблемы, решаемые в Unix простым и элегантным способом в 1968 году. Сколько производственных затрат, времени и денег было потрачено впустую из-за раздувания Microsoft и отсутствия рефакторинга / гибкости / дерзость по всему миру?
  • 16
    Я помню, как использовал git в 68 году, это было великолепно.
Показать ещё 2 комментария
19

В расширении до ответа Криса Долана я использовал следующую альтернативную настройку PS1. Просто добавьте фрагмент кода в ваш ~/.profile(в Win7: c:/Users/USERNAME/.profile).

fast_git_ps1 ()                                                                              
{                                                                                            
    printf -- "$(git branch 2>/dev/null | sed -ne '/^\* / s/^\* \(.*\)/ [\1] / p')"
}                                                                                            

PS1='\[\033]0;$MSYSTEM:\w\007                                                                
\033[32m\]\u@\h \[\033[33m\w$(fast_git_ps1)\033[0m\]                                         
$ '                                                                                          

Это сохраняет преимущества цветной оболочки и отображения текущего имени ветки (если в репозитории git), но на моей машине значительно быстрее, от ~ 0,75 с до 0,1 с.

На основе этого блога.

  • 0
    Отличный ответ. Однако я решил переопределить '__git_ps1 ()' в моем ~ / .bashrc и просто напечатать пустую строку. Это ускоряет все команды Bash.
  • 0
    Я новичок в git, я хотел бы знать, в чем разница между этим fast_git_ps1 и оригинальным довольно сложным __git_ps1. Я понимаю, что это будет работать для большинства «нормальных» случаев, но что нормально и где это не получится?
Показать ещё 2 комментария
9

Я увидел приличное улучшение, установив core.preloadindex в true, как рекомендовано здесь.

6

Я решил свою медленную проблему git на Win 7 x64, запустив cmd.exe с помощью "Запуск от имени администратора".

  • 9
    Вопрос говорит о git bash.
  • 2
    Вы можете запустить git bash от имени администратора; может показаться, что проблема с UAC
Показать ещё 2 комментария
4

Вы также можете получить очень быстрое повышение производительности, изменив следующую конфигурацию git:

git config --global status.submoduleSummary false

При запуске простой команды git status в окне 7 x64 для запуска моего компьютера потребовалось более 30 секунд. После того, как этот параметр был определен, команда будет немедленной.

Активация git собственной трассировки, как описано на следующей странице, помогла мне найти причину проблемы, которая может отличаться в вашей установке: https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so-slow

4

Я знаю, что это старо, но у меня была такая же проблема, как у Git Bash, так и Git Gui. Обе программы используют для удобного запуска, но затем они случайным образом замедлялись до ползания, и я не мог понять, почему. Как оказалось, это был Аваст. Avast вызвал странные вещи с различными программами (включая программы, которые я пишу), поэтому я отключил его на секунду, и, конечно же, Bash теперь работает так же быстро, как и в Linux. Я просто добавил папку программных файлов Git (C:\Program Files\Git) в список исключений Avast, и теперь он работает так же быстро, как и в Linux.

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

3

Как отмечено в ответах Криса Долана и Уилберта, PS1 замедляет вас.

Вместо полного отключения (как было предложено Доланом) или с помощью script, предлагаемого Wilbert, я использую "тупой PS1", который намного быстрее.

Он использует (git symbolic-ref -q HEAD || git rev-parse --short HEAD) 2> /dev/null:

PS1='\033[33m\]\w \n\[\033[32m\]$((git symbolic-ref -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null) \[\033[00m\]# '

На моем cygwin это быстрее, чем Wilbert "fast_git_ps1" ответ - 200 мс против 400 мс, поэтому он немного сокращает вашу быструю инертность.

Это не так сложно, как __git_ps1 - например, он не меняет подсказку, когда вы записываете cd в каталог .git и т.д., но для обычного ежедневного использования это достаточно хорошо и быстро.

Протестировано на git 1.7.9 (cygwin, но должно работать на любой платформе)

  • 0
    Вы также можете использовать опцию --short чтобы не печатать refs/heads/ --short refs/heads/
  • 0
    @friederbluemle, какую версию git вы используете? Мой (1.7.9) не предлагает --short для команды symbolic-ref .
Показать ещё 2 комментария
2

Комбинированные ответы:

  • Wilbert's - какую информацию включить в PS1
  • sinelaw's - (<branch_name>) или (<sha>)
# https://unix.stackexchange.com/questions/140610/using-variables-to-store-terminal-color-codes-for-ps1/140618#140618
# https://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-ps1-prompt
# \033 is the same as \e
# 0;32 is the same as 32
CYAN="$(echo -e "\e[1;36m")"
GREEN="$(echo -e "\e[32m")"
YELLOW="$(echo -e "\e[33m")"
RESET="$(echo -e "\e[0m")"

# https://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# https://stackoverflow.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# https://stackoverflow.com/questions/39518124/check-if-directory-is-git-repository-without-having-to-cd-into-it/39518382#39518382
fast_git_ps1 ()
{
    git -C . rev-parse 2>/dev/null && echo " ($((git symbolic-ref --short -q HEAD || git rev-parse -q --short HEAD) 2> /dev/null))"
}

# you need \] at the end for colors
# Don't set \[ at the beginning or ctrl+up for history will work strangely
PS1='${GREEN}\u@\h ${YELLOW}\w${CYAN}$(fast_git_ps1)${RESET}\] $ '

Результат:

Изображение 3895

2

В моем случае это был антивирус Avast, приводящий к git bash, и даже Powershell становится очень медленным.

Сначала я попытался отключить Avast в течение 10 минут, чтобы увидеть, улучшила ли скорость скорость, и это произошло. Впоследствии я добавил весь каталог установки git bash в качестве исключения в Avast, для чтения, записи и выполнения. В моем случае это было C:\Program Files\Git\*.

  • 0
    Я хочу подтвердить эти советы. Исключение мерзавца из Avast действительно ускоряет работу. Я вижу статус мерзавца без ожидания больше. Win 7 x64
  • 0
    Антивирусы только мешают.
Показать ещё 2 комментария
2

Если вы используете Git из cmd, попробуйте запустить его из Git Bash. В cmd git.exe на самом деле является оберткой, которая настраивает правильную среду каждый раз, когда вы ее запускаете, и только тогда запускает настоящий git.exe. Это может занять до двух раз больше времени, чем требуется, чтобы делать то, что вы хотите. И Git Bash устанавливает среду только после ее запуска.

2

Я столкнулся с той же проблемой, с которой работает git для Windows (msysgit) в Windows 7 x64 как ограниченная учетная запись пользователя довольно долгое время. Из того, что я читал здесь и других мест, общей темой, по-видимому, является отсутствие административных привилегий и/или UAC. Поскольку UAC отключен в моей системе, объяснение, что он пытается записать/удалить что-то в каталоге файлов программ, имеет для меня наибольшее значение.

В любом случае я решил проблему, установив переносимую версию git 1.8 с помощью zipinstaller. Обратите внимание, что мне пришлось распаковать файл распространения .7z и переупаковать его как zip для работы zipinstaller. Мне также пришлось вручную добавить этот каталог в мой системный путь.

Теперь производительность прекрасна. Несмотря на то, что он установлен в каталоге Program Files (x86), у которого у меня нет разрешений для ограниченного пользователя, он, похоже, не страдает от той же проблемы. Я приписываю это либо тому факту, что переносимая версия немного более консервативна, когда она записывает/удаляет файлы, что, вероятно, имеет место, или для обновления с 1.7 до 1.8. Я не собираюсь пытаться определить, в чем причина, достаточно сказать, что сейчас это работает намного лучше, включая bash.

  • 1
    Выключение UAC, похоже, решает для нас «большую» часть проблемы (задержка в несколько секунд). Взлом ps1 сделал все остальное.
  • 0
    То же самое я на SSD, 32 ГБ ОЗУ и четырехъядерном процессоре i7, и ни один из других ответов не помог, отключенные команды UAC, restart и git НЕМЕДЛЕННЫЕ
0

Я очень опаздываю на вечеринку, я знаю...

... но: у моего коллеги были проблемы с git на окнах (7) git status checkout и add были быстрыми, но git commit занимали возрасты.

Мы все еще пытаемся найти основную причину этого, но клонирование репо в новую папку исправило его проблему. Думаю, я бы добавил его здесь, если у кого-то другая проблема, и все еще ищет решение.

0

В моем случае ярлык git bash был установлен на Start in:%HOMEDRIVE%%HOMEPATH% (вы можете проверить это, щелкнув правой кнопкой мыши git bash и выбрав свойства). Это был сетевой диск.

Решение состоит в том, чтобы указать на %HOME%. Если у вас его нет, вы можете настроить его в переменных окружения, и теперь git bash должен быть молниеносным.

0

У меня также была проблема с git медленностью PS1, хотя долгое время я думал, что это проблема размера db (большое репо), и пыталась использовать различные git gc triks, и искала другие причины, просто как ты. Однако в моем случае проблема заключалась в этой строке:

function ps1_gitify
{
   status=$(git status 2>/dev/null )      # <--------------------
   if [[ $status =~ "fatal: Not a git repository" ]]
   then
       echo ""
   else
       echo "$(ps1_git_branch_name)  $(ps1_git_get_sha)"
  fi
}

Итак, что было медленным, он выполнял статус git для каждой строки состояния командной строки. Уч. Это было то, что я написал вручную. Я видел, что это проблема, когда я пробовал

export PS1='$'

как упомянуто в одном ответе здесь. Командная строка была молниеносной.

Теперь я использую это:

function we_are_in_git_work_tree 
{
    git rev-parse --is-inside-work-tree &> /dev/null
}

function ps1_gitify
{
    if ! we_are_in_git_work_tree
    then
    ...

Из этого SO https://stackoverflow.com/questions/4133904/ps1-line-with-git-current-branch-and-colors и он отлично работает. Снова получим быструю командную строку git.

  • 0
    Итак, ваша проблема была вызвана написанным вами сценарием? Возможно, этот сценарий вряд ли будет причиной для других пользователей, которые ищут ту же проблему ...
  • 0
    Взгляните на вопрос об ОП - он упомянул много вещей, которые проверил, и все же это было не так. То же самое было со мной. Поэтому здесь я добавил еще одну вещь, которую нужно проверить, когда ничего не помогает. И важен не тот конкретный сценарий, который я написал, а концепция - посмотрите на свой PS1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню