Por que o git fica me dizendo que é “compactar automaticamente o repositório em segundo plano para desempenho ideal”?

100

Nota : Eu não acho que esta seja uma duplicata desta questão , que está falando sobre um pacote não em segundo plano que trava o git com uma mensagem de erro sutilmente diferente .


Em um dos meus repositórios git, cada vez que invoco (por exemplo) git fetch, git prints:

Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.

Parece imprimir isso todas as vezes se eu fizer um git fetchrepetidamente, mesmo quando não há alterações e nada para git fetchfazer. Isso não faz muito sentido para mim. Também parece acontecer com outras operações de rede, como git pushe git pull.

O comando retorna ao prompt instantaneamente sem saída adicional, e não consigo encontrar nenhum processo git em execução na minha máquina. Parece acontecer apenas com este repositório e apenas nesta máquina. git config -l | grep gcnão retorna nada.

O que posso fazer para diagnosticar ou corrigir esse problema?

$ git --version 
git version 2.0.1

Estou usando o OS X 10.9.

Andrew Ferrier
fonte
Parece o mesmo problema da pergunta que você vinculou, mas está acontecendo rápido o suficiente para não parecer travar.
Holloway
Também possivelmente relacionado
Holloway
Trengot, acho que não. A mensagem de erro é sutilmente diferente - menciona "o fundo".
Andrew Ferrier
Trengot, desculpe, você estava certo, era relacionado (o segundo link). Obrigado pela indicação, veja minha resposta abaixo para detalhes.
Andrew Ferrier de

Respostas:

167

Encontrei a solução no segundo comentário que você forneceu, Trengot, obrigado. Acontece que eu tinha algumas bolhas pendentes, que estavam dentro .git/objects/17e, portanto, acionando o empacotamento:

$ git fsck
dangling blob d9ff0aeac4aa8b4e0907daed675ebf60278bc977
dangling blob dbff2d073741f9775c815d4a3c623736af224dad
dangling blob e1ffbab1c5b985cd1cd3bc0281075ea2ed80744a
dangling blob fdff59878ccb3a75689f4acca615cfb635288774

Isso os limpou:

$ git gc --prune=now

Esteja ciente, de acordo com o comentário de Henrik abaixo, isso pode ser um pouco perigoso. Cuidar!

Andrew Ferrier
fonte
19
Obrigado! Isso pareceu funcionar para mim. Esteja ciente de que --prune=nowé um pouco perigoso. Por padrão, --prunemanterá 2 semanas de blobs pendentes, o que significa que se você acidentalmente fez um rebase incorreto 5 minutos atrás ou removeu um branch ontem, você pode se recuperar. Depois de executar este comando, você perde todos os blogs pendentes até agora - não 2 semanas atrás. Além disso, parece que você nunca deve executá-lo enquanto executa outros comandos Git em outro terminal, ou seu repo pode ser corrompido.
Henrik N de
3
Você salvou meu dia
Owen Chen