Git Bash чрезвычайно медленный в Windows 7 x64

Я использую Git как на Windows, так и на Ubuntu во время разработки небольшого проекта, часто листая взад и вперед между ними. Проблема в том, что Git Bash последовательно становится медленным.

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

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

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

  • добавление папок Git & project в список исключений антивирусного сканера
  • полное отключение моего антивирусного сканера (Kaspersky is 2011)
  • убедитесь, что Outlook не запущен (Outlook 2007)
  • завершение работы всех других приложений
  • запуск Git Bash от имени администратора
  • отключение сетевого подключения, запуск Git Bash и сохранение подключение отключено
  • отключение сетевого подключения, запуск Git Bash, повторное включение соединения (работает только иногда)
  • под управлением git gc
  • и комбинации выше

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

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

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

22 ответов


вы можете значительно ускорить 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/


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

export PS1='$'

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

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

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


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

установите переменную окружения, щелкнув правой кнопкой мыши ваш компьютер на рабочем столе --> Свойства --> Дополнительные параметры системы --> Переменные среды Добавить в раздел пользовательских переменных

HOME=%USERPROFILE%

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

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

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

это сохраняет преимущество цветной оболочки и отображение текущего имени ветви (если в репозитории Git), но это значительно быстрее на моей машине, от ~0.75 s до 0.1 s.

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


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

One включает параллельные предустановки индекса. Из командной строки:

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.


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

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


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


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


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

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

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

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

на моем Cygwin, это быстрее, чем ответ "fast_Git_PS1" Уилберта - 200 мс против 400 мс, поэтому он сбривает немного вашей быстрой вялости.

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

это было протестировано на Git 1.7.9 (Cygwin, но оно должно работать на любой платформе).


У меня была та же проблема, как в Git Bash, так и в Git GUI. Обе программы работают хорошо, но затем они случайно замедлились до обхода, и я не мог понять, почему.

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

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


вы также можете приобрести очень дальнейшей повысить производительность, изменив конфигурацию 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


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


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

  1. Уилберт это - какую информацию включить в PS1
  2. sinelaw это - (<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
# 3 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}\] $ '

результат:

frolowr@RWAMW36650 /c/projects/elm-math-kids (master) $


я столкнулся с той же проблемой при запуске Git для Windows (msysgit) в Windows 7 x64 в качестве ограниченной учетной записи Пользователя в течение некоторого времени.

из того, что я читал здесь и в других местах, общей темой, похоже, является отсутствие административных привилегий и/или UAC. Поскольку UAC отключен в моей системе, объяснение, что он пытается написать / удалить что-то в каталоге program files, имеет для меня наибольший смысл.

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

производительность хорошо. Даже если он установлен в Program Files (x86) каталог, для которого у меня нет разрешений как для ограниченного пользователя, он, похоже, не страдает от той же проблемы.

я приписываю это либо тому факту, что портативная версия немного более консервативна в том, где она пишет/удаляет файлы, что, вероятно, так, или к обновлению с 1.7 до 1.8. Я не собираюсь пытаться определить, какой из них является причиной, достаточно сказать, что теперь он работает намного лучше, включая Bash.


в моем случае это был антивирус Avast, ведущий к Git Bash, и даже PowerShell становится очень медленным.

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


в дополнение к этим другим ответам я ускорил проекты с несколькими подмодулями, используя параллельную выборку подмодулей (начиная с git 2.8 в начале 2016 года).

Это можно сделать с помощью git fetch --recurse-submodules -j8 и git config --global submodule.fetchJobs 8, или сколько ядер у вас есть/хотите использовать.


ничто из вышеперечисленного не смогло мне помочь. В моем сценарии проблема проявлялась так:

  • любой ll команда была медленной (занимала около 3 секунд для выполнения)
  • все последующие ll команда была выполнена мгновенно,но только если в течение 45 секунд от предыдущей команды ls.

когда дело дошло до отладки с Контролировать Процесс было обнаружено, что перед каждой командой был DNS запрос.

Итак, как только я отключил свой брандмауэр (Comodo в моем случае) и позволил команде выполнить проблему. И он не возвращается назад, когда брандмауэр был снова включен. При первой возможности я обновлю этот ответ с более подробной информацией о том, какой процесс выполнял блокировку DNS-запроса и какова была цель.

BR, G


Мне помогло только отключение AMD Radeon Graphics (или Intel Graphics) в Диспетчере устройств.

enter image description here

Я нашел ответ здесь: https://superuser.com/questions/1160349/git-is-extremely-slow-on-windows#=


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

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 status для каждой строки состояния командной строки была медленной. Ай. Я написал это от руки. Я видел, что это была проблема, когда я попробовал

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
    ...

из сообщения переполнения стека PS1 линия с текущей веткой git и цветами и он отлично работает. Снова есть быстрая командная строка Git.


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

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


у моего коллеги были проблемы с Git на Windows (7) git status checkout и add быстро, но!-Взял -3--> века.

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