Git gc
O comando git gc
é um comando de manutenção do repositório. O "gc" é a abreviação para coleta de lixo em inglês. Executar o git gc
é literalmente dizer ao Git para limpar a bagunça que ele fez no repositório atual. A coleta de lixo é um conceito que se origina de linguagens de programação interpretadas que fazem alocação dinâmica de memória. A coleta de lixo em linguagens interpretadas é usada para recuperar a memória que se tornou inacessível para o programa em execução.
Os repositórios Git acumulam vários tipos de lixo. Um tipo de lixo do Git são os commits órfãos ou inacessíveis. Os commits do Git podem ficar inacessíveis ao executar comandos que alteram o histórico, como git resets ou git rebase. Em um esforço para preservar o histórico e evitar a perda de dados, o Git não vai excluir os commits desanexados. Um commit desanexado ainda pode ser verificado, selecionado e examinado por meio do git log
.
Além da limpeza de commit desanexada, o git gc
também vai executar a compactação em objetos Git armazenados, liberando espaço precioso em disco. Quando o Git identifica um grupo de objetos semelhantes, ele os comprime em um "pacote". Os pacotes são como arquivos zip de objetos Git e ficam no ./git/objects/pack
diretório dentro de um repositório.
O que o git gc faz de verdade?
Antes da execução, o git gc
verifica vários valores do git config primeiro. Esses valores vão ajudar a esclarecer o resto da responsabilidade do git gc
.
configuração git gc
gc.reflogExpire
Uma variável opcional que tem como padrão 90 dias. Ele é usado para definir por quanto tempo os registros em um reflog de branches devem ser preservados.
gc.reflogExpireUnreachable
Uma variável opcional que tem como padrão 30 dias. Ela é usada para definir por quanto tempo os registros de reflog inacessíveis devem ser preservados.
gc.aggressiveWindow
Material relacionado
Como mover um Repositório do Git completo
VER SOLUÇÃO
Aprenda a usar o Git com o Bitbucket Cloud
Uma variável opcional que tem como padrão 250. Ele controla quanto tempo é gasto na fase de compactação delta do empacotamento de objetos quando o git gc
é executado com a opção --aggressive
.
gc.aggressiveDepth
Uma variável opcional que tem como padrão 50. Ele controla a profundidade da compactação que o git-repack
usa durante uma execução git gc --aggressive
gc.pruneExpire
Variável opcional que tem como padrão "após 2 semanas". Ele define por quanto tempo um objeto inacessível vai ser preservado antes da remoção
gc.worktreePruneExpire
Variável opcional que tem como padrão "após 3 meses". Ele define por quanto tempo uma árvore de trabalho obsoleta vai ser preservada antes de ser excluída.
execução git gc
Nos bastidores, o git gc
de fato executa um pacote de outros subcomandos internos como git prune, git repack
, git pack
e git rerere
. A responsabilidade de alto nível desses comandos é identificar quaisquer objetos Git que estejam fora dos níveis de limite definidos na configuração git gc
. Depois de identificados, esses objetos são compactados ou removidos de acordo.
Práticas recomendadas e perguntas frequentes do git gc
A coleta de lixo é executada automaticamente em vários comandos usados com frequência:
A frequência com que o git gc
deve ser executado manualmente corresponde ao nível de atividade de um repositório. Um repositório com um único desenvolvedor colaborador vai precisar executar o git gc
com muito menos frequência do que um repositório multiusuário atualizado com frequência.
git gc x git prune
git gc
é um comando pai e git prune
é filho. O git gc
faz o acionamento interno do git prune
. O git prune
é usado para remover objetos Git que foram considerados inacessíveis pela configuração git gc
. Saiba mais sobre o git prune.
O que é git gc aggressive?
O git gc
pode ser invocado com a opção de linha de comando --aggressive
. A opção --aggressive
faz com que o git gc
gaste mais tempo em seu esforço de otimização. Assim o git gc
é executado mais lentamente, mas você vai economizar mais espaço em disco após a conclusão. Os efeitos de --aggressive
são persistentes e só precisam ser executados após um grande volume de alterações em um repositório.
O que é git gc auto?
A variante do comando git gc --auto
primeiro verifica se alguma manutenção é necessária no repositório antes da execução. Se ela achar que o serviço de limpeza não é necessário, nenhum trabalho é feito. Alguns comandos do Git executam implicitamente git gc --auto
após a execução para limpar quaisquer objetos soltos que eles criaram.
Antes da execução, o git gc --auto
vai verificar a configuração do git
para valores de limite em objetos soltos e tamanho de compactação da embalagem. Esses valores podem ser definidos com git config. Se o repositório ultrapassar qualquer um dos limites de manutenção, o git gc --auto
vai ser executado.
Primeiros passos com o git gc
Você provavelmente já está usando o git gc
sem perceber. Conforme discutido na seção de práticas recomendadas, ele é invocado automaticamente por meio de comandos usados com frequência. Se você quiser fazer a invocação manualmente, basta executar o git gc
e você vai ver uma saída indicando o trabalho que ele realizou.
Compartilhar este artigo
Próximo tópico
Leitura recomendada
Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.