Claude Code pode commitar no seu repositório? Até onde vale delegar o Git

Claude Code fazendo commit e abrindo pull request no Git com permissões configuradas
Resposta rápida

Claude Code commit é dos usos mais diretos do agente: a documentação diz que ele prepara as mudanças (stage), escreve a mensagem, cria branch e abre pull request. A régua não é se ele consegue, é o que fica na sua mão. Delegue o repetitivo e trave o irreversível: as permissões vivem em arrays allow, ask e deny no settings.json, avaliados nessa ordem pela primeira correspondência, e a própria doc mostra o exemplo de negar o push com Bash(git push *). Rode /permissions, escreva o deny e só depois solte o primeiro commit do agente.

Deixar o agente escrever a mensagem de commit é uma coisa

deixar ele mexer no histórico que o time inteiro puxa é outra completamente diferente

E a documentação do Claude Code é bem direta nisso: ele prepara as mudanças (stage), escreve a mensagem de commit, cria branches e abre pull requests

Ou seja, o fluxo Git de ponta a ponta já está na mão dele

Então a pergunta que interessa não é "o Claude Code consegue commitar?", é até onde vale entregar o volante antes de você ter um combinado escrito

É isso que a gente fecha aqui: a régua do que delegar, o que deixar sob pergunta, o que nunca sai da sua mão, e um combinado mínimo de 6 passos antes do primeiro commit do agente

O que vale delegar ao agente e o que exige mão humana

A régua é simples: delega o que é repetitivo e reversível, segura o que é público ou irreversível

Ação no GitQuem decide, no combinado que eu recomendo
Stage das mudançasagente, sem dor
Escrever a mensagem de commitagente, sem dor
Criar branchagente, sem dor
Abrir pull request via ghagente, sem dor
Retomar a sessão vinculada ao PRagente, sem dor
git pushsob pergunta ou sob deny
Push na branch padrãosua mão
Force pushsua mão
Escrita direta na pasta .gitfora do delegado (diretório protegido)
git reset --hard, git clean -fd, git stash dropfora do delegado
Domine o Claude Code do básico ao avançado
Pré-inscrição Formação Claude Code

Domine o Claude Code do básico ao avançado

Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!

Só que tem um aviso importante aqui, senão a tabela te engana: isso acima é o COMBINADO que eu recomendo, não o comportamento embutido de qualquer modo

Especificamente na linha do push, o modo auto tem régua própria e bem mais solta (explico ela no cenário de time, logo abaixo)

O que segura o push de verdade é a regra deny ou ask que você escreve, não a boa vontade do modo que estiver ligado

Aquela linha da sessão vinculada ao PR é mais útil do que parece: quando o PR nasce com gh pr create, a sessão fica amarrada nele

Dá pra reabrir depois com claude --from-pr <numero>, que abre o seletor de sessões filtrado por aquele PR, ou colando a URL do PR na busca do /resume

Já os comandos destrutivos da última linha entram na lista de bloqueio do auto mode quando o usuário não pediu pra descartar trabalho local

E tem um detalhe que muita gente descobre tarde: o checkpoint do Claude Code não rastreia arquivos modificados por comando bash

rm, mv e cp não voltam pelo rewind

Só edição feita pelas ferramentas de edição de arquivo é rastreada, e a própria documentação orienta continuar usando Git como histórico permanente

Traduzindo: o rewind não é sua rede de segurança pro repositório, o Git é

O que ter pronto antes de dar acesso ao repositório

Lista curta, tudo verificável antes de soltar o agente:

  • Repositório Git de verdade, não uma pasta solta
  • gh CLI instalado, se o seu fluxo é GitHub: a doc recomenda porque o Claude sabe usar o gh pra criar issues, abrir pull requests e ler comentários
  • Saber em qual arquivo a regra vai morar
  • Decidir a atribuição que vai ficar gravada no histórico público

Sobre onde a regra mora, são três níveis:

  • ~/.claude/settings.json: usuário, vale em todo projeto
  • .claude/settings.json: projeto, compartilhado com o time (esse vai versionado)
  • .claude/settings.local.json: local, fora do versionamento

E a atribuição sai pelo campo attribution, que tem precedência sobre o antigo includeCoAuthoredBy (depreciado)

O campo commit controla o texto no commit e o pr controla o texto no pull request

Agora a parte que evita briga boba: a precedência

Os managed settings ficam no topo, e nem argumento de linha de comando passa por cima deles

Um deny em qualquer nível não é liberado por outro nível

--allowedTools não anula um deny de managed settings, e --disallowedTools só acrescenta restrição, nunca afrouxa

Se você está começando agora e ainda está montando a base da ferramenta, vale ver por onde começar no Claude Code antes de sair mexendo em permissão

O combinado mínimo: 6 passos antes do primeiro commit do agente

  1. Rode /permissions e olhe o que já existe
/permissions

Ele lista todas as regras e mostra de qual settings.json cada uma veio

O erro comum deste passo: editar o arquivo errado e ficar achando que a regra não pegou, quando na verdade tem outra regra em outro nível decidindo antes 🙂

  1. Libere o commit e barre o push

Esse é o coração do combinado: o agente commita à vontade, mas nada sai da sua máquina sem você

{
  "permissions": {
    "allow": ["Bash(git commit:*)"],
    "deny": ["Bash(git push *)"]
  }
}

O erro comum deste passo: achar que uma regra allow mais específica vence o deny

Não vence

As regras são avaliadas na ordem deny, depois ask, depois allow, e a primeira correspondência decide, independente de quão específica a outra seja

  1. Escreva o padrão no formato certo

A regra segue Tool ou Tool(especificador), e o sufixo :* é uma forma equivalente de curinga final, reconhecida apenas no fim do padrão

"deny": ["Bash(git push:*)"]

Isso equivale a Bash(git push *)

O erro comum deste passo (e é clássico): escrever Bash(git:* push) achando que o curinga funciona no meio

Não funciona, ali os dois pontos viram caractere literal e o padrão simplesmente não casa

Aí você acha que travou o push e não travou nada

  1. Use ask no que você quer conferir toda vez

Às vezes você não quer barrar, quer só ser avisado

"ask": ["Bash(git push:*)"]

Uma regra ask no mesmo escopo força a pergunta mesmo quando o comando seria aprovado automaticamente

  1. Ajuste a assinatura que vai pro histórico público
{
  "attribution": {
    "commit": "",
    "pr": ""
  }
}

Pra esconder tudo, commit e pr como string vazia e sessionUrl como false

Tome cuidado aqui: histórico é público e permanente, então decida ANTES do primeiro commit, não depois de 40 deles

  1. Feche a porta do bypass
{
  "permissions": {
    "disableBypassPermissionsMode": "disable"
  }
}

Esse ajuste costuma ficar em managed settings como política de organização, mas funciona em qualquer escopo

O usuário pode se travar sozinho, e às vezes é exatamente isso que você quer

O porquê: o modo bypassPermissions pula os prompts inclusive pra escrita em caminho protegido como .git e .claude, e a documentação restringe o uso dele a ambiente isolado (container, VM ou dev container sem acesso à internet), onde o Claude Code não pode danificar o sistema hospedeiro

A flag --dangerously-skip-permissions desliga todos os prompts pelo mesmo caminho

Passo opcional, pra quem quer trava dura: um hook PreToolUse

Sair com código 2 bloqueia a chamada de ferramenta antes dela executar, e a razão vai no stderr voltando como feedback pro Claude

O detalhe forte é que esse bloqueio acontece antes da avaliação das regras de permissão, então ele barra mesmo existindo uma regra allow

A alternativa é sair com 0 imprimindo JSON com permissionDecision em deny e o permissionDecisionReason explicando

Quatro cenários e o nível de acesso que cada um pede

1. Projeto pessoal, sem plateia:

Aqui dá pra soltar bastante

Começa no plan mode, em que o Claude lê arquivos e explora mas não altera o código fonte, só propõe

Depois libera o commit e mantém o push sob deny até você pegar confiança no ritmo dele

Os modos documentados são default (manual), acceptEdits, plan, auto, dontAsk e bypassPermissions, então tem bastante espaço pra calibrar

2. Repositório de time:

A regra sai do seu computador e vai pro .claude/settings.json versionado, pra valer pra todo mundo

E aqui o auto mode merece atenção, porque ele funciona como substituto do aprovador humano: é um classificador de transcript rodando no Sonnet 4.6, em dois estágios

Primeiro um filtro rápido de um token (sim pra bloquear, não pra liberar) e, só quando o filtro sinaliza, uma segunda passada com raciocínio em cadeia

Se liga nisso, porque é aqui que a tabela lá de cima deixa de valer sozinha: com o auto ligado, o padrão DELE é permitir push pra qualquer branch do repositório em que se está trabalhando, incluindo a branch padrão

Ou seja, isso é régua do modo auto, que você precisa escolher, e não do default (o modo manual)

Escolheu o auto sem escrever nada? Então o push sai sem te perguntar, e a única coisa que segura ele é a sua regra deny ou ask

Branch com cara de alvo de deploy ou publicação (production, release, gh-pages) fica fora desse padrão e é julgada caso a caso pelo classificador

Já push pra organização de controle de código da empresa fica bloqueado até ser declarado em autoMode.environment

E dá pra manter as regras embutidas e estender com as suas: incluir a string literal "$defaults" no array insere as regras padrão naquela posição, então você herda as atualizações em vez de congelar uma cópia

Se o fluxo do time já passa por pipeline, vale olhar também como automatizar CI/CD com o agente sem abrir mão dessas travas

3. Reescrita de histórico:

Essa é a que fica na mão humana, e o próprio desenho da ferramenta já diz isso

O force push está na lista de bloqueios suaves embutidos do auto mode, junto com curl | bash, deploys de produção e bypass do auto mode

Só que bloqueio suave é suave mesmo: a intenção explícita do usuário sobrepõe

Pedir "limpe o repositório" não autoriza force push

Pedir "force-push nessa branch" autoriza

Ou seja, a trava real contra reescrever trabalho dos outros continua sendo o combinado que VOCÊ escreveu, não a boa vontade do prompt

4. Várias frentes ao mesmo tempo:

Quando você quer duas ou três tarefas rodando sem uma pisar na outra, o caminho são as sessões paralelas em git worktrees isoladas

claude --worktree minha-feature

Também funciona com -w

Por padrão a worktree é criada em .claude/worktrees/<valor>/ na raiz do repositório, numa branch nova chamada worktree-<valor>

A documentação orienta adicionar .claude/worktrees/ ao .gitignore, e um arquivo .worktreeinclude leva arquivos ignorados (tipo .env) pra cada worktree nova

No aplicativo desktop isso já vem de graça: cada sessão nova em repositório Git recebe uma cópia isolada do projeto via git worktree, e as mudanças de uma sessão não afetam as outras até o commit

E tem um caminho de menos atrito pra quem cansou de aprovar comando a comando: o sandbox

Ele aplica isolamento de sistema de arquivos e de rede imposto pelo sistema operacional a cada comando Bash e seus processos filhos

Em vez de aprovar um por um, você define quais arquivos e domínios de rede podem ser tocados

No uso interno da Anthropic, isso reduziu os pedidos de permissão em 84%

Conclusão: o combinado em uma frase e o próximo passo

Delegue o trabalho repetitivo (stage, mensagem de commit, branch, PR) e mantenha na sua mão o que é irreversível ou público (push na branch padrão, force push, reescrita de histórico)

É isso, cabe em uma frase mesmo

E lembra do detalhe que muda tudo na prática: escrever essa régua é trabalho SEU, porque o auto já vem permitindo push por conta própria

Vale lembrar que existe defesa documentada contra prompt injection: o sistema de permissões, detecção de injeção de comando e verificação de confiança

O auto mode ainda acrescenta uma sonda no servidor que varre resultados de ferramentas em busca de conteúdo suspeito, e o classificador nunca vê resultado de ferramenta, então texto injetado não influencia a decisão de aprovação

Mas nada disso substitui você decidir onde fica a linha

Próximo passo concreto, na ordem: roda /permissions pra ver o que já está valendo, escreve o deny do push, e só depois solta o primeiro commit do agente

Depois disso é ir afrouxando conforme a confiança, não antes…

até o próximo post! 😀

Perguntas frequentes

O Claude Code pode dar git push sozinho sem eu autorizar?

Depende do modo de permissão que está ligado. O padrão do modo auto é permitir push para qualquer branch do repositório em que você está trabalhando, incluindo a branch padrão, sem perguntar (só branch com nome de alvo de deploy, como production, release ou gh-pages, sai desse padrão e é julgada caso a caso). Isso é régua do auto, que precisa ser escolhido, e não do default, que é o modo manual. De qualquer forma, quem trava isso de verdade em qualquer modo é a sua regra: coloque Bash(git push:*) em deny ou ask no settings.json.

Como impedir que o Claude Code faça force push no repositório?

O force push está na lista de bloqueios suaves embutidos do auto mode, junto com curl | bash e deploys de produção. Mas intenção explícita do usuário sobrepõe esse bloqueio: pedir "limpe o repositório" não autoriza force push, já pedir "force-push nessa branch" autoriza. Fora do auto mode, o mesmo padrão deny usado pro push normal cobre o force push.

Dá pra desfazer um commit ou um rm feito pelo Claude Code com o rewind?

Não sempre. O checkpoint do Claude Code não rastreia arquivos modificados por comando bash, então rm, mv e cp não voltam pelo rewind. Só edição feita pelas próprias ferramentas de edição de arquivo é rastreada, e a documentação orienta continuar usando o Git como histórico permanente para o resto.

O Claude Code consegue escrever direto na pasta .git?

A pasta .git está na lista de diretórios protegidos, junto com .vscode, .idea e outros, e essa checagem roda antes das regras allow do settings.json. O desfecho muda por modo: em default, acceptEdits e plan a escrita é perguntada; em auto ela vai para o classificador; em dontAsk é negada; só em bypassPermissions ela é permitida sem prompt.

Como aparece a autoria do Claude Code no commit e no pull request?

Pelo campo attribution no settings.json, que tem precedência sobre o antigo includeCoAuthoredBy (já depreciado). O subcampo commit controla o texto que vai no commit e o pr controla o texto do pull request; para esconder os dois, basta deixar ambos como string vazia e sessionUrl como false.

Quando faz sentido usar o modo bypassPermissions no Git?

Quase nunca no seu repositório principal: o bypassPermissions pula todos os prompts, inclusive para escrita em .git, e a documentação restringe seu uso a ambiente isolado, como container ou VM sem acesso à internet. Se quiser garantir que ninguém ative esse modo por engano, dá pra desligar com permissions.disableBypassPermissionsMode em disable, inclusive na própria configuração do usuário.



Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares