Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.43.0 11/20/23
- 2.42.1 no changes
- 2.42.0 08/21/23
- 2.41.0 06/01/23
- 2.38.1 → 2.40.1 no changes
- 2.38.0 10/02/22
- 2.37.1 → 2.37.7 no changes
- 2.37.0 06/27/22
- 2.31.1 → 2.36.6 no changes
- 2.31.0 03/15/21
- 2.30.1 → 2.30.9 no changes
- 2.30.0 12/27/20
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
egc.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 dogit 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ávelgc.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 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:
-
Qualquer objeto com um tempo de modificação mais recente que a data
--prune
é mantido, junto com tudo o que pode ser acessado. -
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]