tag - git windows




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

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

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

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

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

Одно из решений, которое работало - временно - для меня, - отключить мое сетевое соединение (как предлагается в этом ответе ), запустить Git Bash, а затем снова подключиться. Иногда он продолжает работать быстро через несколько дней после этого, но производительность всегда ухудшается в конечном итоге. В течение нескольких недель я просматривал дискуссионную группу msysgit, Stack Overflow, список выпусков 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.


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

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


В расширении ответа Криса Долана я использовал следующую альтернативную настройку PS1 . Просто добавьте фрагмент кода в ваш ~ / .profile (в Windows 7: 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\]\[email protected]\h \[\033[33m\w$(fast_git_ps1)\033[0m\]
$ '

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

Это основано на этом сообщении в блоге .


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


Как многие говорили, это связано с тем, что stash является скриптом оболочки в Windows, но с git 2.18.0 у установщика Windows есть опция для экспериментальной функции гораздо более быстрой (~ 90%) встроенной версии stash https://github.com/git-for-windows/build-extra/pull/203


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

  1. Wilbert's - какая информация включить в PS1
  2. 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://.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/19500237#19500237
# https://.com/questions/4485059/git-bash-is-extremely-slow-in-windows-7-x64/13476961#13476961
# https://.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}\[email protected]\h ${YELLOW}\w${CYAN}$(fast_git_ps1)${RESET}\] $ '

Результат:


Мой домашний каталог 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.



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

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


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

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

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


У меня также была проблема с медленностью 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
    ...

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


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



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


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

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

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

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

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





mingw32