Eu tenho usado o Git no Windows e no Ubuntu durante o desenvolvimento de um projeto pequeno, alternando frequentemente entre os dois. A questão é que o Git Bash fica lento de forma consistente.
Quando digo devagar, quero dizer que a execução cd
leva de 8 a 25 segundos, os git
comandos de execução demoram de 5 a 20 segundos e ls
às vezes podem levar até 30 segundos. Escusado será dizer que isso não é divertido, para não mencionar improdutivo. Eu sei que o Git é mais lento no Windows, mas isso é ridículo.
A única solução que funcionou temporariamente para mim foi desativar minha conexão de rede (como sugerido nesta resposta ), iniciar o Git Bash e reconectar. Às vezes, continua a funcionar rapidamente por dias depois de fazer isso, mas o desempenho sempre diminui eventualmente. Pesquisei o grupo de discussão msysgit, Stack Overflow, lista de problemas do msysgit, etc. por semanas, mas não consegui encontrar soluções que funcionem.
Até agora, eu tentei:
- Adicionando pastas Git e projeto à lista de exclusão do antivírus
- Desativando meu antivírus completamente (Kaspersky IS 2011)
- Garantindo que o Outlook não esteja em execução (Outlook 2007)
- Desligando todos os outros aplicativos
- Executando o Git Bash como administrador
- Desabilitando a conexão de rede, iniciando o Git Bash e mantendo a conexão desabilitada
- Desativando a conexão de rede, iniciando o Git Bash, reativando a conexão (funciona apenas ocasionalmente)
- Corrida
git gc
- E combinações dos itens acima
Eu li que algumas pessoas conseguiram desativar a conclusão do Bash, mas, idealmente, eu gostaria de manter isso ativo. A versão do msysgit é 1.7.3.1-preview20101002 e o sistema operacional é o Windows 7 x64. A execução das mesmas coisas no Linux é, previsivelmente, extremamente rápida. Eu usaria o Linux exclusivamente, mas também preciso executar coisas no Windows (certos aplicativos, testes etc.).
Alguém já encontrou um problema semelhante? Em caso afirmativo, qual era o problema subjacente e qual era a solução (se houver)?
Isso se estende além dos repositórios Git, mas apenas para referência, os repositórios com os quais tenho usado o Git são bem pequenos: ~ 4-50 arquivos no máximo.
Respostas:
Você pode acelerar significativamente o Git no Windows executando três comandos para definir algumas opções de configuração:
Notas:
core.preloadindex
realiza operações do sistema de arquivos em paralelo para ocultar a latência (atualização: habilitada por padrão no Git 2.1)core.fscache
corrige problemas de UAC para que você não precise executar o Git como administrador (atualização: habilitada por padrão no Git for Windows 2.8)gc.auto
minimiza o número de arquivos em .git /fonte
Você tem informações do Git exibidas no prompt do Bash? Nesse caso, talvez você esteja inadvertidamente trabalhando demais em todos os comandos. Para testar essa teoria, tente a seguinte alteração temporária no Bash:
fonte
$(__git_ps1)
... querer retirar esta faz tudo superC:\Program Files (x86\Git\etc\profile
e comente o if-then-else onde__git_ps1
é adicionadoPS1
.Meu diretório inicial do Windows está na rede e eu suspeitava que os comandos do Git Bash estivessem olhando primeiro. Com certeza, quando olhei
$PATH
, ele foi listado/h/bin
primeiro, onde/h
há um compartilhamento em um servidor de arquivos do Windows, mesmo que/h/bin
não exista.Eu editei
/etc/profile
e comentei o comando de exportação que o coloca em primeiro lugar$PATH
:Isso fez com que meus comandos rodassem muito mais rápido, provavelmente porque o Git Bash não está mais procurando na rede os executáveis. Meu
/etc/profile
foic:\Program Files (x86)\Git\etc\profile
.fonte
HOME="$(cd "$HOME" ; pwd)"
paraHOME="$(cd "$USERPROFILE" ; pwd)"
e agora tudo é incrivelmente rápido. Obrigado pela dica.Eu achei que a unidade de rede era o problema de desempenho.
HOME
estava apontando para um compartilhamento de rede lento. Não pude substituir,HOMEDRIVE
mas isso não é um problema do que vi.Defina a variável de ambiente clicando com o botão direito do mouse na área de trabalho -> Propriedades -> Configurações avançadas do sistema -> Variáveis de ambiente.
fonte
Em uma extensão da resposta de Chris Dolan, usei a seguinte
PS1
configuração alternativa . Basta adicionar o fragmento de código ao seu ~ / .profile (no Windows 7: C: /Users/USERNAME/.profile).Isso mantém o benefício de um shell colorido e a exibição do nome atual da ramificação (se estiver em um repositório Git), mas é significativamente mais rápido na minha máquina, de ~ 0,75 sa 0,1 s.
Isso é baseado nesta postagem do blog .
fonte
__git_ps1
inclui informações de status, não apenas o nome da filial. Por exemplo, se você estiver em um estado de cabeça desanexada, no dir git, em um repositório vazio, no meio da escolha da cereja ou rebasing ou mesclagem ... Isso será mais rápido, mas poderá haver ocasiões em que você perderá essa informação extra, especialmente como iniciante no Git.Embora o seu problema possa ser baseado em rede, eu pessoalmente acelerei minhas
git status
chamadas locais em dez vezes (mais de 7 segundos a 700 ms), fazendo duas modificações. Este está em um repositório de 700 MB com 21.000 arquivos e um número excessivo de arquivos binários grandes.Um é ativar pré-carregamentos paralelos de índice. Em um prompt de comando:
git config core.preloadindex true
Isso mudou
time git status
de 7 segundos para 2,5 segundos.Também desabilitei o UAC e o driver "luafv" (é necessário reiniciar). Isso desativa um driver no Windows Vista, 7 e 8 que redireciona os programas que tentam gravar nos locais do sistema e, em vez disso, redireciona esses acessos para um diretório de usuários.
Para ver uma discussão sobre como isso afeta o desempenho do Git, leia aqui: https://code.google.com/p/msysgit/issues/detail?id=320
Para desativar esse driver, no regedit, altere a tecla "Iniciar" em
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/luafv
para 4 para desativar o driver. Em seguida, coloque o UAC na configuração mais baixa, "nunca notifique".Se a desativação desse driver o deixar desconfiado (deveria), uma alternativa está sendo executada em uma unidade (ou partição) diferente da partição do sistema. Aparentemente, o driver é executado apenas no acesso a arquivos na partição do sistema. Eu tenho um segundo disco rígido e vejo resultados idênticos quando executado com esta modificação do registro na minha unidade C, como faço sem ela na unidade D.
Essa alteração leva
time git status
de 2,5 segundos para 0,7 segundos.Você também pode seguir https://github.com/msysgit/git/pull/94 e https://github.com/git/git/commit/d637d1b9a8fb765a8542e69bd2e04b3e229f663b para verificar quais trabalhos adicionais estão em andamento para problemas de velocidade no Windows .
fonte
Parece que desinstalar completamente o Git, reiniciar (a solução clássica do Windows) e reinstalar o Git foi a solução. Também limpei todos os arquivos de configuração do bash que sobraram (eles foram criados manualmente). Tudo está rápido novamente.
Se por algum motivo a reinstalação não for possível (ou desejável), eu definitivamente tentaria alterar a variável PS1 mencionada na resposta de Chris Dolan ; resultou em acelerações significativas em determinadas operações.
fonte
Resolvi meu problema lento do Git no Windows 7 x64 iniciando o cmd.exe com "Executar como administrador".
fonte
Vi uma melhoria decente ao configurar core.preloadindex como true, conforme recomendado aqui .
fonte
Como observado nas respostas de Chris Dolan e Wilbert, o PS1 deixa você mais lento .
Em vez de desativar completamente (como sugerido por Dolan) ou usar o script oferecido por Wilbert, eu uso um "PS1 burro" que é muito mais rápido.
Usa
(git symbolic-ref -q HEAD || git rev-parse --short HEAD) 2> /dev/null
:No meu Cygwin, isso é mais rápido que a resposta "fast_Git_PS1" de Wilbert - 200 ms vs. 400 ms, portanto diminui um pouco sua rápida lentidão.
Não é tão sofisticado quanto
__git_ps1
- por exemplo, não altera o prompt quando você entra no diretório .git, etc., mas para o uso diário normal, é bom o suficiente e rápido.Isso foi testado no Git 1.7.9 (Cygwin, mas deve funcionar em qualquer plataforma).
fonte
--short
opção para não imprimirrefs/heads/
--short
osymbolic-ref
comando.Você também pode obter um aumento de desempenho muito subseqüente alterando a seguinte configuração do Git:
Ao executar o
git status
comando simples na Janela 7 x64, o meu computador levou mais de 30 segundos para ser executado. Depois que essa opção foi definida, o comando é imediato.A ativação do rastreio do Git, conforme explicado na página a seguir, me ajudou a encontrar a origem do problema, que pode ser diferente em sua instalação: https://github.com/msysgit/msysgit/wiki/Diagnosing-why-Git-is-so- lento
fonte
Eu estava tendo o mesmo problema, tanto no Git Bash quanto na GUI do Git. Ambos os programas costumam funcionar bem, mas então diminuem aleatoriamente para um rastreamento, e eu não conseguia descobrir o porquê.
Como se viu, era o Avast. O Avast fez com que coisas estranhas acontecessem com vários programas (incluindo programas que eu escrevi), então eu o desativei por um segundo e, com certeza, o Bash agora roda tão rápido quanto no Linux. Acabei de adicionar a pasta de arquivos de programa Git (
C:\Program Files\Git
) à lista de exclusão do Avast e agora ela roda tão rápido quanto no Linux.E sim, eu sei que o software antivírus não era o problema na postagem original, mas vou colocar isso aqui caso seja útil para alguém.
fonte
Além dessas outras respostas, acelerou projetos com vários submódulos usando a busca paralela por submódulos (desde o Git 2.8 no início de 2016).
Isso pode ser feito
git fetch --recurse-submodules -j8
e definido comgit config --global submodule.fetchJobs 8
, ou com quantos núcleos você tiver / deseja usar.fonte
Se você usa o Git do cmd, tente executá-lo no Git Bash. No cmd, o git.exe é na verdade um invólucro que configura o ambiente correto toda vez que você o inicia e só então inicia o git.exe real. Pode levar até o dobro do tempo necessário para fazer o que você deseja. E o Git Bash configura o ambiente apenas quando é iniciado.
fonte
Somente desligar o AMD Radeon Graphics (ou Intel Graphics) no Gerenciador de dispositivos me ajudou.
Encontrei a resposta aqui: /superuser/1160349/git-is-extremely-slow-on-windows# =
fonte
Respostas combinadas:
(<branch_name>)
ou(<sha>)
Resultado:
fonte
core.commitGraph=true
de blogs.msdn.microsoft.com/devops/2018/06/25/... e outro de blogs.msdn.microsoft.com/devops/tag/gitEu encontrei o mesmo problema ao executar o Git for Windows (msysgit) no Windows 7 x64 como uma conta de usuário limitada por algum tempo.
Pelo que li aqui e em outros lugares, o tema comum parece ser a falta de privilégios administrativos e / ou UAC. Como o UAC está desativado no meu sistema, a explicação de que ele está tentando gravar / excluir algo no diretório de arquivos do programa faz mais sentido para mim.
De qualquer forma, resolvi meu problema instalando a versão portátil do Git 1.8 com o zipinstaller. Observe que eu tive que descompactar o arquivo de distribuição .7z e reembalá-lo como um arquivo ZIP para que o zipinstaller funcionasse. Eu também tive que adicionar manualmente esse diretório ao caminho do sistema.
O desempenho está bom agora. Embora esteja instalado no
Program Files (x86)
diretório para o qual não tenho permissões como usuário limitado, ele não parece sofrer do mesmo problema.Eu atribuo isso ao fato de que a versão portátil é um pouco mais conservadora no local em que grava / exclui arquivos, o que provavelmente é o caso, ou na atualização de 1.7 para 1.8. Não vou tentar identificar qual é o motivo, basta dizer que funciona muito melhor agora, incluindo o Bash.
fonte
No meu caso, na verdade, era o antivírus Avast levando o Git Bash e até o PowerShell a ficarem muito lentos.
Tentei desativar o Avast pela primeira vez por 10 minutos para ver se melhorava a velocidade. Depois, adicionei todo o diretório de instalação do Git Bash como uma exceção no Avast, para Leitura, Gravação e Execução. No meu caso, isso foi
C:\Program Files\Git\*
.fonte
Nada do acima foi capaz de me ajudar. No meu cenário, o problema estava se mostrando assim:
ll
comando estava lento (demorava cerca de 3 segundos para ser executado)ll
comando subseqüente foi executado instantaneamente, mas apenas se 45 segundos após o comando ls anterior .Quando se tratava de depuração com o Process Monitor , verificou-se que antes de cada comando havia uma solicitação de DNS.
Então, assim que eu desabilitei meu firewall (Comodo no meu caso) e deixei o comando executar, o problema desapareceu. E ele não volta quando o firewall foi ligado novamente. Com a primeira oportunidade, atualizarei esta resposta com mais detalhes sobre o processo que estava executando uma solicitação de bloqueio de DNS e qual era o destino.
BR, G
fonte
ll
sendo um apelido paralog
? Parece estranho que haja solicitações de DNS para isso.ll
é um alias parals -l
. E ainda é estranho disparar uma solicitação de DNS de qualquer maneira ... Enquanto isso, ainda estou esperando o problema aparecer novamente para adicionar mais detalhes à resposta.No meu caso, o atalho do Git Bash foi definido como
Start in:%HOMEDRIVE%%HOMEPATH%
(você pode verificar isso clicando com o botão direito do mouse em Git Bash e selecionando propriedades). Esta foi a unidade de rede.A solução é fazê-lo apontar
%HOME%
. Se você não o possui, pode configurá-lo nas variáveis de ambiente e agora o Git Bash deve ser muito rápido.fonte
Eu também tive problemas com a lentidão do git PS1, embora por muito tempo eu estivesse pensando que fosse um problema de tamanho de banco de dados (grande repositório) e tentasse vários
git gc
truques e procurasse outros motivos, como você. No entanto, no meu caso, o problema era esta linha:A
git status
execução de todas as linhas de status da linha de comando era lenta. Ai. Foi algo que escrevi à mão. Vi que isso era um problema quando tentei ocomo mencionado em uma resposta aqui. A linha de comando estava muito rápida.
Agora eu estou usando isso:
Na linha Stack Overflow pós PS1, com ramificação e cores atuais git , funciona bem. Novamente, tenha uma linha de comando rápida do Git.
fonte
Um colega de trabalho meu teve problemas com o Git no Windows (7)
git status
checkout
eadd
foi rápido, masgit commit
levou anos.Ainda estamos tentando encontrar a causa raiz disso, mas a clonagem do repositório em uma nova pasta corrigiu o problema.
fonte
Como muitos disseram, isso se deve a
stash
um script de shell no Windows, mas desde o Git 2.18.0 o instalador do Windows tem uma opção para um recurso experimental de uma versão interna muito mais rápida (~ 90%) do stash - https: / /github.com/git-for-windows/build-extra/pull/203 .fonte
stash
, mas o seu é o primeiro post mencionandostash
especificamente. Isso afeta outras operações do Git?stash
e / ourebase
usar um executável nativo para obter melhor desempenho, mas com qualquer coisa na visualização, sempre há uma pequena chance de que possa haver um pequeno efeito colateral.