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 в список исключений антивирусного сканера
  • отключить мой антивирус полностью (Касперского 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 367

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 МБ репозитория с 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, который перенаправляет программы, пытающиеся писать в системные папки, и вместо этого перенаправляет эти обращения к a каталог пользователя.

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

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

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

Я увидел достойное улучшение, установив ядро.preloadindex to 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 вызвал странные вещи с различными программами (включая программы, которые я пишу), поэтому я отключил его на секунду, и, конечно же, 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 statuscheckout и add быстро, но!--3--> прошло много времени.

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