Git
Português (Brasil) ▾ Topics ▾ Latest version ▾ git-gc last updated in 2.33.0

NOME

git-gc - Limpa os arquivos desnecessários e otimiza o repositório local

RESUMO

git gc [--aggressive] [--auto] [--quiet] [--prune=<data> | --no-prune] [--force] [--keep-largest-pack]

DESCRIÇÃO

Executa várias tarefas de limpeza no repositório atual, como a compactação dos arquivos das revisões (para reduzir o espaço em disco e aumentar o desempenho), a remoção dos objetos inacessíveis que podem ter sido criados a partir de invocações anteriores ao git add, pacotes refs, a remoção do "reflog", metadados reerere ou árvores de trabalho obsoletas. Pode também atualizar os índices auxiliares, como o grafo do commit.

Quando as operações porcelana tradicionais que criam os objetos são executadas, elas verificam se o repositório cresceu substancialmente desde a última manutenção e se for o caso, executam o o comando git gc automaticamente. Consulte gc.auto abaixo para saber como desativar este comportamento.

A execução manual do comando git gc só é necessária ao adicionar objetos em um repositório quando não executar regularmente estes comandos porcelana, para executar uma otimização única do repositório ou como por exemplo, para limpar uma importação em massa que esteja abaixo do ideal. Consulte a seção "OTIMIZAÇÃO DE PACOTE" no git-fast-import[1] para obter mais detalhes sobre o caso de importação.

OPÇÕES

--aggressive

Normalmente, o comando git gc roda de forma muito rápida, proporcionando uma boa utilização do espaço e do desempenho em disco. Esta opção fará com que o comando git gc otimize de forma mais agressiva o repositório à custa de levar muito mais tempo. Os efeitos dessa otimização em geral são persistentes. Consulte a seção "AGRESSIVO" abaixo para obter detalhes.

--auto

Com esta opção, o comando git gc verifica se é necessário alguma limpeza; caso contrário, sai sem fazer nada.

Consulte a opção gc.auto na seção "CONFIGURAÇÃO" abaixo para saber como essa heurística funciona.

Caso seja excedido os limites definidos nas opções de configuração como gc.auto e gc.autoPackLimit o processo de limpeza é acionado, todas as outras tarefas de limpeza (como rerere, árvores de trabalho, reflog…​, etc) também serão executados.

--prune=<data>

Elimine os objetos soltos anteriores à data (a predefinição retorna para de 2 semanas atrás, substituível pela variável de configuração gc.pruneExpire). A opção --prune=now elimina objetos soltos independentemente da idade e aumenta o risco de corrupção caso outro processo esteja gravando no repositório; consulte "OBSERVAÇÕES" abaixo. A predefinição é que a opção --prune esteja sempre ativada.

--no-prune

Não corte qualquer dos objetos soltos.

--quiet

Suprimir todos os relatórios de progresso.

--force

Imponha a execução do git gc mesmo que possa haver uma outra instância do git gc em execução neste repositório.

--keep-largest-pack

Todos os pacotes, exceto o maior e os marcados com um arquivo .keep, são consolidados em um único pacote. Quando esta opção é utilizada, a variável gc.bigPackThreshold é ignorada.

AGRESSIVO

Quando a opção --aggressive é utilizada, git-repack[1] será invocado com a opção -f, que por sua vez passará a opção --no-reuse-delta para git-pack-objects[1]. Isso descartará quaisquer deltas existentes e os computará novamente, às custas de se gastar muito mais tempo na re-embalagem.

Os efeitos disso são predominantemente persistentes, como por exemplo, quando os pacotes e os objetos soltos são reunidos entre si, os deltas existentes neste pacote podem ser reutilizados, porém também existem vários casos onde em vez disso, podemos escolher um delta não otimizado de um pacote mais novo.

Além disso, utilizar --aggressive irá ajustar as opções --depth e --window encaminhadas para o git-repack[1]. Consulte as configurações gc.aggressiveDepth e gc.aggressiveWindow abaixo. Ao utilizar um tamanho de janela maior, é mais provável que encontremos deltas mais otimizados.

Provavelmente não vale a pena utilizar esta opção em um determinado repositório sem antes executar um benchmark de desempenho sob medida. Leva muito mais tempo e a otimização de espaço/delta resultante pode ou não valer a pena. Não utilizar isso de forma alguma é um dilema para a maioria dos usuários e seus repositórios.

CONFIGURAÇÃO

A documentação abaixo é igual à encontrada no git-config[1]:

Warning

Missing pt_BR/config/gc.txt

See original version for this content.

OBSERVAÇÕES

O comando git gc evita muito a não exclusão dos objetos que possuam referencias em qualquer lugar do seu repositório. Ele manterá não apenas os objetos referenciados pelo seu conjunto atual das ramificações e as tags, mas também os objetos referenciados através do índice, as ramificações monitoradas remotamente, as notas salvas através do comando git notes no refs/notes/, reflogs (que podem fazer referência no commit dos ramos que foram alterados ou retrocedido posteriormente) e qualquer outra coisa no espaço dos nomes refs/*. Caso você esteja esperando que alguns objetos sejam excluídos e não foram, verifique todos estes locais e decida se faz sentido remover as referências ou não.

Por outro lado, quando o git gc é executado simultaneamente com outro processo, existe o risco de excluir um objeto que o outro processo está utilizando e que não criou uma referência para ele ainda. Isso pode causar falha no outro processo ou corromper o repositório caso o outro processo adicione posteriormente uma referência ao objeto excluído. O Git possui dois recursos que atenuam bastante este problema:

  1. Qualquer objeto com um tempo de modificação mais recente que a data --prune é mantido, junto com tudo o que pode ser acessado.

  2. A maioria das operações que adicionam um objeto ao banco de dados atualiza a hora da modificação do objeto, caso já esteja presente para que #1 se aplique.

No entanto, estes recursos ficam aquém de uma solução completa; portanto, os usuários que executam comandos simultaneamente, precisam enfrentar algum risco de corrupção (o que na pratica, o risco parece ser baixo).

GANCHOS

O comando git gc --auto executará o gancho pre-auto-gc. Para mais informações consulte githooks[5].

GIT

Parte do conjunto git[1]