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