Я использовал 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, но просто для справки: репозитории, с которыми я работал, были довольно маленькими: максимум 4-50 файлов.
Ответы:
Вы можете значительно ускорить Git в Windows, запустив три команды для настройки некоторых параметров конфигурации:
Ноты:
core.preloadindex
выполняет операции файловой системы параллельно, чтобы скрыть задержку (обновление: включено в Git 2.1 по умолчанию)core.fscache
исправляет проблемы с UAC, поэтому вам не нужно запускать Git от имени администратора (обновление: по умолчанию включено в Git для Windows 2.8)gc.auto
минимизирует количество файлов в .git /источник
У вас есть информация о Git, отображаемая в приглашении Bash? Если это так, возможно, вы случайно выполняете слишком много работы для каждой команды. Чтобы проверить эту теорию, попробуйте следующее временное изменение в Bash:
источник
$(__git_ps1)
... удаление этого делает все очень быстрымC:\Program Files (x86\Git\etc\profile
и закомментируйте if-then-else, куда__git_ps1
добавляетсяPS1
.Мой домашний каталог Windows находится в сети, и я подозревал, что команды Git Bash искали там в первую очередь. Конечно же, когда я посмотрел
$PATH
, он/h/bin
сначала перечислил , где/h
находится общий ресурс на файловом сервере Windows, хотя/h/bin
он и не существует.Я отредактировал
/etc/profile
и прокомментировал команду экспорта, которая ставит ее первой в$PATH
:Это заставило мои команды работать намного быстрее, вероятно, потому что Git Bash больше не ищет в сети исполняемые файлы. Мой
/etc/profile
былc:\Program Files (x86)\Git\etc\profile
.источник
HOME="$(cd "$HOME" ; pwd)"
наHOME="$(cd "$USERPROFILE" ; pwd)"
, и теперь все чертовски быстро. Спасибо за совет.Я обнаружил, что сетевой диск был проблемой производительности.
HOME
указывал на медленный сетевой ресурс. Я не мог отменить,HOMEDRIVE
но это не проблема из того, что я видел.Задайте переменную среды, щелкнув правой кнопкой мыши по компьютеру на рабочем столе -> свойства -> Расширенные настройки системы -> Переменные среды Добавить в раздел пользовательских переменных
источник
В качестве дополнения к ответу Криса Долана я использовал следующие альтернативные
PS1
настройки. Просто добавьте фрагмент кода в ваш ~ / .profile (в Windows 7: C: /Users/USERNAME/.profile).Это сохраняет преимущество цветной оболочки и отображения текущего имени ветки (если в Git-репозитории), но это значительно быстрее на моей машине, от ~ 0,75 с до 0,1 с.
Это основано на этом сообщении в блоге .
источник
__git_ps1
содержит информацию о состоянии, а не только название филиала. Например, если вы находитесь в состоянии отстраненной головы, в git dir, в голом репо, посреди сбора вишни, перебазировки или слияния ... Это будет быстрее, но могут быть случаи, когда вы пропустите эта дополнительная информация, особенно как начинающий Git.Хотя ваша проблема может быть связана с сетью, я лично ускорил свои локальные
git status
вызовы в десять раз (с 7+ секунд до 700 мс), выполнив две модификации. Это хранилище объемом 700 МБ с 21 000 файлов и избыточным количеством больших двоичных файлов.Один включает параллельные предварительные загрузки индекса. Из командной строки:
git config core.preloadindex true
Это изменилось
time git status
с 7 секунд до 2,5 секунд.Я также отключил 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
:На моем Cygwin это быстрее, чем ответ "fast_Git_PS1" Уилберта - 200 мс против 400 мс, так что он немного сбивает вашу медлительность.
Это не так сложно, как
__git_ps1
- например, оно не меняет подсказку, когда вы переходите в каталог .git и т. Д., Но для обычного повседневного использования это достаточно хорошо и быстро.Это было проверено на Git 1.7.9 (Cygwin, но он должен работать на любой платформе).
источник
--short
опцию не печататьrefs/heads/
--short
дляsymbolic-ref
команды.Вы также можете значительно повысить производительность, изменив следующую конфигурацию Git:
При запуске простой
git status
команды в Windows 7 x64 мой компьютер работал более 30 секунд. После того, как эта опция была определена, команда является немедленной.Активация собственной трассировки Git, как объяснялось на следующей странице, помогла мне найти источник проблемы, которая может отличаться в вашей установке: https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so- медленный
источник
У меня была такая же проблема, как в Git Bash, так и в Git GUI. Обе программы хорошо работают, но затем они случайно замедлились до ползучести, и я не мог понять, почему.
Как оказалось, это был Аваст. Avast вызывал странные вещи с различными программами (включая программы, которые я пишу), поэтому я отключил его на секунду, и, конечно же, Bash теперь работает так же быстро, как и в Linux. Я просто добавил папку программных файлов Git (
C:\Program Files\Git
) в список исключений Avast, и теперь он работает так же быстро, как и в Linux.И да, я понимаю, что антивирусное программное обеспечение не было проблемой в оригинальном посте, но я просто помещу это здесь на случай, если оно кому-нибудь пригодится.
источник
В дополнение к этим другим ответам я ускорил проекты с несколькими подмодулями, используя параллельную выборку подмодулей (начиная с Git 2.8 в начале 2016 года).
Это можно сделать с помощью
git fetch --recurse-submodules -j8
или установить с помощьюgit config --global submodule.fetchJobs 8
любого количества ядер, которые вы хотите / хотите использовать.источник
Если вы используете Git из cmd, попробуйте запустить его из Git Bash. В cmd git.exe на самом деле является оберткой, которая устанавливает правильную среду каждый раз, когда вы ее запускаете, и только после этого запускает настоящий git.exe. Это может занять вдвое больше времени, чем требуется, чтобы просто делать то, что вы хотите. А Git Bash настраивает среду только тогда, когда она запускается.
источник
Помогло только отключение AMD Radeon Graphics (или Intel Graphics) в диспетчере устройств.
Я нашел ответ здесь: /superuser/1160349/git-is-extremely-slow-on-windows# =
источник
Объединенные ответы:
(<branch_name>)
или(<sha>)
Результат:
источник
core.commitGraph=true
от blogs.msdn.microsoft.com/devops/2018/06/25/... и других из blogs.msdn.microsoft.com/devops/tag/gitЯ столкнулся с той же проблемой при запуске Git для Windows (msysgit) на Windows 7 x64 в качестве учетной записи ограниченного пользователя в течение достаточно долгого времени.
Из того, что я читал здесь и в других местах, общей темой, похоже, является отсутствие административных привилегий и / или UAC. Поскольку UAC в моей системе отключен, объяснение того, что он пытается что-то записать / удалить в каталоге программных файлов, имеет для меня наибольшее значение.
В любом случае, я решил свою проблему, установив переносную версию Git 1.8 с zipinstaller. Обратите внимание, что для работы zipinstaller мне пришлось распаковать дистрибутивный файл .7z и упаковать его как ZIP-файл. Мне также пришлось вручную добавить этот каталог в мой системный путь.
Производительность в порядке сейчас. Несмотря на то, что он установлен в
Program Files (x86)
каталоге, для которого у меня нет разрешений как для ограниченного пользователя, похоже, что он не страдает от той же проблемы.Я приписываю это либо факту, что портативная версия немного более консервативна в том, что она пишет / удаляет файлы, что, вероятно, имеет место, либо обновлению с 1.7 до 1.8. Я не собираюсь пытаться определить причину, достаточно сказать, что теперь она работает намного лучше, включая Bash.
источник
В моем случае это был антивирус Avast, который привел к появлению Git Bash, и даже PowerShell стал очень медленным.
Сначала я попытался отключить Avast на 10 минут, чтобы увидеть, улучшил ли он скорость. После этого я добавил весь каталог установки Git Bash в качестве исключения в Avast для чтения, записи и выполнения. В моем случае это было
C:\Program Files\Git\*
.источник
Ничто из перечисленного не могло мне помочь. В моем сценарии проблема проявлялась так:
ll
команда была медленной (выполнение заняло около 3 секунд)ll
команда была выполнена мгновенно, но только если в течение 45 секунд после предыдущей команды ls .Когда дело дошло до отладки с помощью Process Monitor, выяснилось, что перед каждой командой был DNS-запрос.
Поэтому, как только я отключил брандмауэр (в моем случае Comodo) и позволил команде выполнить команду, проблема исчезла. И он не возвращается, когда брандмауэр был снова включен. При первой же возможности я обновлю этот ответ с более подробной информацией о том, какой процесс выполнял блокирующий DNS-запрос и какова была цель.
BR, G
источник
ll
быть псевдонимом дляlog
? Кажется странным, что для этого будут запросы DNS.ll
это псевдоним дляls -l
. И все равно странно инициировать DNS-запрос в любом случае ... Тем не менее, я все еще жду, когда эта проблема появится снова, чтобы добавить больше подробностей в ответ.В моем случае ярлык Git Bash был установлен на
Start in:%HOMEDRIVE%%HOMEPATH%
(вы можете проверить это, щелкнув правой кнопкой мыши Git Bash и выбрав свойства). Это был сетевой диск.Решение состоит в том, чтобы указать на это
%HOME%
. Если у вас его нет, вы можете установить его в переменных окружения, и теперь Git Bash должен работать молниеносно.источник
У меня также была проблема с медлительностью git PS1, хотя долгое время я думал, что это проблема размера базы данных (большой репозиторий), пробовал разные
git gc
приемы и искал другие причины, такие же, как вы. Однако, в моем случае, проблема была в этой строке:Выполнение
git status
строки состояния для каждой командной строки было медленным. Уч. Это было то, что я написал от руки. Я увидел, что это проблема, когда я попробовалкак упомянуто в одном ответе здесь. Командная строка была молниеносной.
Теперь я использую это:
Из стека переполнения пост строки PS1 с git текущей веткой и цветами, и все работает отлично. Опять быстрая командная строка Git.
источник
У моего коллеги были проблемы с Git на Windows (7),
git status
checkout
и ониadd
были быстры, ноgit commit
заняли целую вечность.Мы все еще пытаемся найти причину этого, но клонирование хранилища в новую папку решило его проблему.
источник
Как многие говорили, это происходит из-за того,
stash
что это сценарий оболочки в Windows, но после Git 2.18.0 установщик Windows имеет опцию для экспериментальной функции гораздо более быстрой (~ 90%) встроенной версии stash - https: / /github.com/git-for-windows/build-extra/pull/203 .источник
stash
, но ваш первый пост упоминаетstash
конкретно. Влияет ли это на другие операции Git?stash
и / илиrebase
использовать собственный исполняемый файл для лучшей производительности, но при любом предварительном просмотре всегда есть небольшой шанс, что может быть небольшой побочный эффект.