O que significa “Empacotando automaticamente o repositório para obter o melhor desempenho”?


225

Estou tendo um problema com meu repositório Git. Nos últimos dias, sempre que envio um push para o servidor, recebo a seguinte mensagem: "Empacotando automaticamente o repositório para obter o desempenho ideal", e ele parece não desaparecer e retornar o shell.

Também tentei fazer check-out para uma nova ramificação e, em seguida, refazer a minha ramificação anterior e, em seguida, git gcremover os objetos de histórico não utilizados e, em seguida, fazer um push, mas ainda assim essa mensagem aparece. Informe-me o que está acontecendo com meu repo.

Respostas:


305

Versão curta: significa o que diz e, se você deixar terminar, tudo ficará bem.

Durante a maioria das operações que podem aumentar potencialmente o número de objetos soltos (descompactados) no repositório (incluindo pushes), o Git chama git gc --auto. Se houver objetos soltos suficientes (por padrão, pelo menos 6700), ele será chamado git repack -d -lpara compactá-los. Se houver muitos pacotes separados, ele também será reembalado em um.

Um pacote é um arquivo único compactado em delta, contendo um grande número de objetos. É mais eficiente armazenar objetos em pacotes, mas leva tempo para compactar (compactar) objetos, para que o Git crie objetos soltos inicialmente e os empacote em lotes de vez em quando, por meio da invocação automática de git gc --auto.

Se você deixar o Git terminar de reembalar, isso não acontecerá novamente por um tempo. De fato, pode demorar um pouco, especialmente se você tiver muitos objetos binários grandes, mas se estiver sendo acionado, é um sinal de que provavelmente reduzirá drasticamente a quantidade de espaço em disco ocupado pelo repositório. Se você realmente não quer que isso aconteça, você pode alterar o parâmetro de configuração gc.auto. Se você aumentar para algo muito maior que 6700, isso acontecerá com menos frequência, mas levará mais tempo. Se você diminuí-lo, ainda terá que fazer sua reembalagem atual, mas subsequentemente isso acontecerá com mais frequência e terminará mais rapidamente. Se você defini-lo como 0, desabilitará a reembalagem automática.

Consulte man git-gc(abaixo --auto) e man git-config(abaixo gc.auto) para obter mais informações.


14
Na verdade, isso levou cerca de 5 minutos para mim, mas acabou. Ótima resposta.
— Joshua Pinter

6
Estamos vendo isso acontecer a cada empurrão (fazendo alguns segundos, heh).

2
@dpk: Isso não deve acontecer em circunstâncias normais - o número de objetos em um único envio não deve ser grande o suficiente para acioná-lo (a menos que seu repositório seja enorme e / ou você esteja enviando uma tonelada de confirmações), portanto, uma vez bem-sucedido conclui (você está deixando concluir, certo?) isso não deve acontecer novamente até que você o construa. Se você não conseguir descobrir, faça uma pergunta separada.
— Cascabel

6
"Se você deixar o Git terminar", e ele pode ... fatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack- é o que recebo por colocar toda a nossa base de código em um repositório git. Acho que eu vou matar aplicativos e força repack "manualmente"
— ruffin

11
Estou conseguindo todas as vezes que faço um puxão no traseiro. Eu fiz um manual git gc, mas ainda acontece toda vez que eu puxo. Esquisito.
— Barry Kelly

51

Embora o Jefroni esteja certo de que às vezes o empacotamento automático precisa de tempo para ser concluído, se a mensagem do empacotamento automático persistir por vários dias, conforme a descrição do OP, há uma boa chance de que a limpeza do git esteja perdendo objetos pendentes, conforme descrito nesta pergunta .

Para ver se os objetos pendentes estão acionando mensagens em andamento sobre empacotamento automático, tente executar git fsck. Se você receber uma longa lista de confirmações pendentes, poderá limpá-las com

git gc --prune=now

Normalmente, eu tenho que executar isso no meu repositório a cada 2-3 meses, quando a mensagem de empacotamento automático não desaparece após um único puxão.


5
Embora não seja a resposta aceita, era exatamente isso que eu precisava. Eu recebia a mensagem toda vez que fazia um git pull, durante vários dias, e de fsckfato mostrava uma tonelada de confirmações pendentes.
— Jörn Zaefferer

36

Para desativar para um projeto:

cd your_project_dir
git config gc.auto 0

Para desativar globalmente:

git config --global gc.auto 0

2
Acho que descobri como: vá para a pasta .git, abra o arquivo de configuração e exclua o texto 'auto = 0' e salve. Isso parece reativar o empacotamento automático.
— Adrian Keister

18
git config --unset gc.auto
— jtatum 1/11/2013

10

O Git está executando o git-repack, que empacota muitos objetos (= arquivos, confirmações e árvores) em um arquivo de pacote. O Git faz isso algumas vezes, quando uma heurística diz que pode haver espaço economizado (um arquivo de pacote contém deltas de objetos compactados, enquanto cada arquivo no diretório de objetos / contém o conteúdo completo do arquivo)


2

Felizmente, essa git gc --autoetapa é agora (git 2.0.1, 25 de junho de 2014) mais eficiente.
Veja commit 62aad18 de Nguyễn Thái Ngọc Duy ( pclouds)

gc --auto: não bloqueie refs em segundo plano

9f673f9 ( gc: opção de configuração para executar --auto em segundo plano - 08-02-2014, Git 2.0.0) coloca " gc --auto" em segundo plano para reduzir o tempo de espera do usuário.
Parte da coleta de lixo são refs de embalagens e reflogs de poda. Isso requer o bloqueio de algumas referências e pode abortar outros processos que tentam bloquear a mesma referência.

Se gc --autofor disparado no meio de um script, os bloqueios de retenção do gc em segundo plano poderão falhar no script, o que nunca poderia acontecer antes do 9f673f9 .

Continue executando pack-refse " reflog --prune" em primeiro plano para interromper atualizações de ref paralelas. As demais operações em segundo plano (reembalar, remover e rerere) não devem afetar os processos git em execução.

E o Git 2.22 (Q2 2019) otimiza ainda maisgit gc .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.