Configurações avançadas do gitconfig
1. Estrutura e Inclusão Condicional de Configurações
O Git organiza suas configurações em uma hierarquia de escopos que permitem controle granular sobre o comportamento da ferramenta. A precedência segue esta ordem: --system (todo o sistema), --global (usuário), --local (repositório atual) e --worktree (árvore de trabalho específica).
O recurso mais poderoso para gerenciar múltiplos contextos é o includeIf. Com ele, é possível carregar configurações específicas baseadas no diretório ou branch atual.
# ~/.gitconfig
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig-personal
# ~/.gitconfig-work
[user]
name = João Silva
email = joao.silva@empresa.com
[core]
hooksPath = ~/work/.githooks
# ~/.gitconfig-personal
[user]
name = João Silva
email = joao.pessoal@gmail.com
[commit]
gpgSign = true
2. Aliases e Comandos Customizados Avançados
Aliases no Git podem ir muito além de simples atalhos. Com funções shell inline, é possível criar comandos complexos que aceitam argumentos dinâmicos.
[alias]
# Desfaz o último commit mantendo as alterações
undo = !f() { git reset --soft HEAD~1; }; f
# Log gráfico com formatação personalizada
llog = log --graph --oneline --decorate --all
# Busca em commits por autor e mensagem
find-commit = !f() { git log --all --grep="$1" --author="$2"; }; f
# Squash dos últimos N commits
squash = !f() { git reset --soft HEAD~$1 && git commit --amend; }; f
# Lista branches mesclados ao branch atual
merged-branches = !f() { git branch --merged | grep -v "\\*\\|main\\|master"; }; f
O alias squash permite combinar os últimos N commits em um só: git squash 3 mescla os três commits mais recentes.
3. Configurações de Merge e Rebase
Controlar estratégias de merge e rebase evita conflitos desnecessários e mantém um histórico limpo.
[merge]
# Apenas fast-forward (recusa merge real)
ff = only
# Ou forçar merge commit mesmo quando fast-forward possível
# ff = false
conflictstyle = diff3
[rebase]
# Auto-stash antes de rebase
autoStash = true
# Auto-squash durante rebase interativo
autoSquash = true
# Rebase com atualização automática
updateRefs = true
[mergetool]
prompt = false
keepBackup = false
[mergetool "vimdiff"]
cmd = vim -d $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J'
A configuração merge.conflictstyle = diff3 mostra o conteúdo original do merge base, facilitando a resolução de conflitos.
4. Assinatura e Verificação de Commits
Para ambientes que exigem verificação de autoria, a assinatura de commits pode ser configurada globalmente ou por repositório.
[commit]
gpgSign = true
[gpg]
# Formato para chaves GPG
program = gpg2
[gpg "ssh"]
# Arquivo com chaves SSH autorizadas
allowedSignersFile = ~/.ssh/allowed_signers
[user]
signingkey = ~/.ssh/id_ed25519.pub
Para múltiplas chaves, use includeIf:
# ~/.gitconfig-work
[user]
signingkey = ABCDEF1234567890
[commit]
gpgSign = true
Verifique assinaturas com git log --show-signature ou configure verificação automática:
[log]
showSignature = true
5. Otimização de Performance e Comportamento
Repositórios grandes exigem ajustes específicos para manter a performance aceitável.
[core]
# Pré-carrega o índice para operações mais rápidas
preloadIndex = true
# Cache do sistema de arquivos (Windows)
fscache = true
# Desabilita verificação de stat() em arquivos grandes
trustctime = false
[fetch]
# Remove automaticamente branches remotas deletadas
prune = true
# Profundidade para clones rasos
depth = 1
[gc]
# Auto garbage collection a cada 7000 objetos
auto = 7000
# Mantém apenas os últimos 2 dias de reflog
reflogExpire = 2.days
[http]
# Aumenta buffer para uploads grandes
postBuffer = 524288000
# Força HTTP/2 se disponível
version = HTTP/1.1
Para clonagem mais rápida de repositórios grandes:
[protocol]
version = 2
6. Hooks e Automação via gitconfig
Hooks globais permitem executar scripts em todos os repositórios sem configurar cada um individualmente.
[core]
hooksPath = ~/.git-hooks
Crie o diretório e adicione hooks executáveis:
# ~/.git-hooks/pre-commit
#!/bin/bash
echo "Executando lint automático..."
npx eslint . --fix
git add -u
Para hooks em novos repositórios, configure init.templateDir:
[init]
templateDir = ~/.git-template
Copie hooks para ~/.git-template/hooks/ e eles serão incluídos automaticamente em git init.
7. Segurança e Controle de Acesso
Configurações de segurança evitam problemas comuns em ambientes compartilhados.
[safe]
# Permite repositórios em diretórios específicos
directory = *
[credential]
# Helper para armazenar credenciais
helper = store
# Helper específico para GitHub
helper = "!f() { gh auth git-credential; }; f"
[http]
# Verificação SSL (desabilitar apenas em redes controladas)
sslVerify = true
# Proxy corporativo se necessário
proxy = http://proxy.empresa.com:8080
[protocol]
# Permite apenas protocolos seguros
allow = always
version = 2
Para evitar o erro "dubious ownership" em diretórios compartilhados:
[safe]
directory = /caminho/compartilhado/*
Referências
- Git SCM - Documentação Oficial do git-config — Referência completa de todas as opções de configuração do Git
- Atlassian - Advanced Git Configuration — Tutorial avançado sobre configurações do Git com exemplos práticos
- GitHub Blog - Signing commits with GPG — Guia oficial do GitHub sobre assinatura e verificação de commits
- Git SCM - Git Hooks Documentation — Documentação completa sobre hooks do Git e automação
- Git SCM - Git Attributes and Configuration — Capítulo do livro Pro Git sobre personalização avançada de configurações
- Stack Overflow - Git includeIf Examples — Exemplos práticos de uso do includeIf para configurações condicionais
- Git SCM - Performance Tuning — Opções de performance para repositórios grandes no Git