O status do Git leva muito tempo para ser concluído

85

Estou usando gitpara gerenciar arquivos em um diretório local em uma máquina Windows - nenhuma rede está envolvida aqui, não estou empurrando ou puxando de / para outra máquina. Meu diretório contém talvez 100 arquivos, todos arquivos de teste, bem pequenos. Quando corro git status, normalmente leva de 20 a 30 segundos para ser concluído. Isso é normal? Há algo que eu possa fazer para acelerá-lo ou uma maneira melhor de ver o estado do meu repositório (arquivos alterados, arquivos não rastreados, etc.)? Outros gitcomandos parecem ser concluídos muito mais rápido.

Matt McMinn
fonte
Qual versão do git você está usando? Por favor, considere pedir ajuda no msysGit Google Group ou na lista de e-mail git (git [at] vger.kernel.org, você não precisa se inscrever), talvez este seja um bug no git.
Jakub Narębski

Respostas:

129

Você já tentou git gc ? Isso limpa a sujeira do repositório git.

Scott
fonte
3
Isso parece ter funcionado. Estou muito surpreso que depois de apenas alguns commits o repositório terá tanta coisa que pode ser limpa - obrigado!
Matt McMinn
4
Hehe, acabei de executar o git statususando o timecomando e obtive um tempo "real" de 30.464s. Então eu corri git gcem seguida, time git statusmais uma vez e tem um tempo real de 35.409s. Muito estranho.
RyanScottLewis
14
Isso me corrigiu de 33 segundos para menos de 1 segundo para a maioria dos meus repositórios. Seria bom se o Git lhe dissesse para fazer isso quando você começar a chegar nesse ponto. Eu nunca soube que era necessário.
XP84
Ao executar git statusvárias vezes consecutivas, as execuções subsequentes ocupam apenas uma fração da primeira. Então, se você estiver executando git status, então git gce git statusnovamente, espera-se que seja executado super rápido.
kiewic
7

Em um problema semelhante, descobri que ter um repo git em um diretório abaixo do meu repo git existente causou uma lentidão enorme.

Mudei o repositório git secundário para outro lugar e agora a velocidade é rápida!

Sargento
fonte
Eu adiciono um problema semelhante. O que aconteceu foi o git init em um subdiretório. O problema disso é que o subdir está meio escondido (você precisa fazer git status dentro para ver as alterações), mas acho que o git ainda está tentando computá-las. Eu ignoro o subdiretório e está tudo bem agora.
mb14
6

Você está usando algum tipo de software de proteção contra vírus? Talvez isso esteja interferindo nas coisas. gité muito rápido para mim no windows com repositórios de 1000 arquivos.

1800 INFORMAÇÕES
fonte
1
Sim, o empregador determinou o TrendMicro OfficeScan. Matei o scanner de vírus, mesmos resultados com o status git.
Matt McMinn
1
Outra variante desse tema é um software de criptografia instantâneo como o Credant, que pode tornar sua máquina extremamente mais lenta.
Don Branson
Esse foi o problema para mim. Antivírus Kaspersky morto e o status voltou para <1 segundo.
Robin Winslow
5

Você já tentou reembalar? git-repack .

Caso contrário, tente duplicar o diretório e excluir a pasta .git do diretório duplicado. Em seguida, crie um novo diretório git e veja se ele ainda está lento.

Se ainda estiver lento, parece um problema de sistema ou hardware. O Git finaliza o status de centenas de arquivos para mim em menos de 5 segundos.

thedz
fonte
Repack pareceu ajudar - depois de executá-lo, executei o status e ele retornou imediatamente. No entanto, esperei alguns segundos e executei o status novamente, o que levou 30 segundos. Tentei duplicar o diretório e tive o mesmo problema.
Matt McMinn
Hmm interessante. Você tem um drive externo? Ou um pendrive USB? Tente copiar o repo ali e veja se há alguma diferença. É possível que haja um problema com a unidade em que ela está.
thedz
Nenhuma diferença em uma unidade USB.
Matt McMinn
Isso é muito estranho. Tudo o que posso realmente dizer neste momento é que não sei. Você pode tentar copiar seu repo e testá-lo no computador de outra pessoa - isso deve, pelo menos, informar se é um problema local em seu sistema.
thedz
4

Por algum motivo, git statusé particularmente lento depois de mover ou copiar a pasta do repositório para um novo local.

As execuções subsequentes são geralmente mais rápidas neste caso.

DanJAB
fonte
1
Existe uma maneira de evitar essa lentidão na primeira corrida? Tentei git gc, mas não adiantou. Não é um problema, pois só acontece na primeira vez após copiar os arquivos.
franksands,
Não estou ciente de uma maneira de evitar a lentidão inicial, mas se houvesse algum comando que pudesse fazer isso, provavelmente estaria fazendo a mesma coisa que o git statuscomando inicial , então provavelmente levaria o mesmo tempo para ser concluído.
DanJAB
4

Meu git statusestava muito lento (até um minuto), porque o .gitignorearquivo global estava localizado no meu perfil de usuário do Windows, que estava armazenado em um compartilhamento de rede inacessível.

git config --global core.excludesfile
mostrou algo como \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

Por algum motivo, \\Nxxxx0estava inacessível e meu perfil de usuário foi carregado de um sistema de backup \\Nxxxxx1. Demorou algum tempo para descobrir isso, porque geralmente meu perfil de usuário está vinculado a uma letra de unidade por um script de inicialização de empresa e acessar essa letra de unidade estava funcionando normalmente. Não sei por que o git-config usou o compartilhamento de rede e não a letra da unidade (provavelmente um eu mais jovem é o culpado)

Após a configuração
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusvoltou à velocidade normal.

Arigion
fonte
3

Correr git fsckjá resolveu esse problema para mim no passado.

Conta
fonte
3

Para mim, a lentidão foi devido a ter muitos arquivos não rastreados (arquivos temporários e de saída de scripts). A execução git status -uno, que exclui os arquivos não rastreados, foi executada muito mais rápido e atende aos meus requisitos

MK Hunter
fonte
1

O problema para mim era que eu tinha muitos repositórios diferentes clonados em meu disco rígido local, quanto mais repositórios você tiver, mais tempo levará para executar comandos como git status.

Eu simplesmente apaguei muitos repos que não precisava mais localmente, e meu status git passou de 1 minuto ~ para 5 segundos.

Não consigo ver nenhuma resposta semelhante a esta aqui.

Jack Perry
fonte
1
Não acho que isso possa afetar o padrão que git statusvocê executa em um diretório de forma alguma. Se seus repositórios tiverem check-out em diretórios diferentes, você só poderá executar git statusum deles por vez. Pode ser uma história diferente se seus repositórios git estiverem se sobrepondo, mas isso é uma má ideia de qualquer maneira.
Hubert Grzeskowiak
@HubertGrzeskowiak definitivamente pode. Eles estavam todos em lugares diferentes no meu disco rígido para mim, mas isso afetou muito meus tempos de carregamento ao digitar o status git. Após remover os repositórios duplicados, ele ficou imediatamente mais rápido de vários minutos para 5 segundos.
Jack Perry
1

Outro aspecto de git status que será melhorado (no Git 2.14.x / 2.15, Q4 2017) é quando ele mostra arquivos ignorados também ( git status --ignored)

"git status --ignored ", ao perceber que um diretório sem nenhum caminho rastreado é ignorado, ainda enumera todos os caminhos ignorados no diretório, o que é desnecessário.
O codepath foi otimizado para evitar essa sobrecarga.

Consulte o commit 5aaa7fd (18 de setembro de 2017) de Jameson Miller ( jamill) .
(Fundido por Junio ​​C Hamano - gitster- no commit 075bc9c , 29 de setembro de 2017)

Melhorar o desempenho de git status --ignored

Melhore o desempenho da lógica de listagem de diretórios quando desejar listar diretórios ignorados não vazios. Para mostrar diretórios ignorados não vazios, a lógica existente irá iterar recursivamente por todo o conteúdo de um diretório ignorado.
Essa alteração introduz a otimização para parar de iterar pelo conteúdo assim que encontrar o primeiro arquivo. Isso pode ter uma melhoria significativa no desempenho de 'git status --ignored' em repositórios com um grande número de arquivos em diretórios ignorados.

Para obter um exemplo da diferença de desempenho em um repositório de exemplo com 196.000 arquivos em 400 diretórios ignorados:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

Para obter mais melhorias (definido no Git 2.17, Q2 2018), consulte esta resposta .

VonC
fonte
Exemplo totalmente aleatório aqui: node_modulespode ser afetado por essa mudança de desempenho. Apenas talvez.
Seth Battin
1

Versões mais antigas do git têm um problema de desempenho com o git status - veja Maneiras de melhorar o desempenho do git status para obter mais informações.

git 2.13 tem 1 correção e 2.17 mais. Mudei de 2.7 para 2.23 e resolveu o status lento. Há outra melhoria planejada para 2.24 em breve.

Brett
fonte
0

No meu caso, a lentidão foi causada pela corrida git status como um usuário diferente do proprietário dos arquivos no projeto.

Embora não seja aplicável em todas as instâncias, um simples chownpara o usuário atual pode resolver o problema.

Czar Pino
fonte
-13

Tente começar com um novo clone de seu checkout.

git clone myrepo mynewrepo

e git status em mynewrepo.

Alternativamente, e se você for mais corajoso, limpe o lixo de seu caixa existente.

git clean -dfx

Isso evita que o git tenha que escanear alguns (possivelmente grandes) conjuntos de arquivos ignorados ou não registrados.

Alex Brown
fonte
Não acho que excluir todos os seus arquivos ignorados (o que o git clean faz) ajudaria, ele já os está ignorando. O mais provável é que a execução de git clean excluiria todos os seus arquivos de configuração, etc, etc. E este comando não pode ser desfeito. Re-clonagem (primeiro salvando seu repositório antigo caso você precise) é muito melhor do que executar git clean e tem o mesmo efeito.
XP84
5
Eu tenho que discordar dessa resposta, executar git clean -dfx pode quebrar as coisas.
Marcel Valdez Orozco