VS Code Adiciona "Co-Authored-by Copilot" em Todos os Commits
A extensão Copilot do VS Code injeta silenciosamente um trailer Co-Authored-by nos seus commits — mesmo quando você escreveu cada linha sozinho. Veja exatamente como impedir isso.
Co-authored-by: GitHub Copilot às mensagens de commit sempre que está envolvida na geração delas — e às vezes mesmo quando não está. Isso afeta registros de autoria, históricos de contribuição em projetos open-source e, potencialmente, políticas de propriedade intelectual de empregadores. Você pode neutralizar isso com um git hook, uma alteração nas configurações do VS Code ou uma regra global no gitconfig — cada uma com diferentes trade-offs.Se você olhou seu git log recentemente e notou uma linha estranha no final de mensagens de commit que escreveu inteiramente sozinho, não está imaginando coisas. O GitHub Copilot — ou mais precisamente, a extensão Copilot do VS Code — tem carimbado silenciosamente seu nome nos commits como co-autor, independentemente de ter tocado em uma única linha daquele push. Isso não é uma conspiração; é um sistema de atribuição opt-out por padrão que a maioria dos desenvolvedores nunca aceitou conscientemente. O que se segue é um detalhamento preciso de como a injeção funciona, por que o GitHub a construiu dessa forma e — o mais útil — exatamente quais configurações, hooks e configs farão isso parar.
O Que o Trailer Realmente Parece
Antes de corrigir qualquer coisa, é útil saber exatamente com o que você está lidando. O texto injetado é um trailer de commit git padrão — um par chave-valor anexado após uma linha em branco no final do corpo da mensagem de commit. Ele segue o mesmo formato usado por git interpret-trailers e ferramentas como o Gerrit e a própria infraestrutura de merge do GitHub:
feat: add user authentication flow
Implement JWT-based login with refresh token rotation.
Co-authored-by: GitHub Copilot <github-copilot[bot]@users.noreply.github.com>
Essa última linha é o que o Copilot injeta. O endereço de e-mail github-copilot[bot]@users.noreply.github.com é uma conta de bot real do GitHub, o que significa que o gráfico de contribuições e o motor de atribuição de commits do GitHub realmente registram isso como uma co-autoria — não um comentário, não metadados que você pode ignorar. É um objeto git de primeira classe embutido permanentemente no histórico dos seus commits após ser enviado.
Onde Aparece
- Visão de commit do GitHub: O commit exibirá um badge "Co-authored by GitHub Copilot" ao lado do seu avatar.
git log --format=full: O trailer aparece no corpo completo do commit.git shortlog: Dependendo da análise, o Copilot pode aparecer como contribuidor nas estatísticas do projeto.- Gráfico de contribuidores do GitHub: A conta bot pode se registrar como contribuidora no seu repositório.
git rebase -i ou git filter-branch) para removê-lo é uma operação destrutiva que vai forçar o push e quebrar os históricos locais dos seus colegas. Prevenção é significativamente mais fácil que remediação.O Commit Onde É Mais Provável Aparecer
A injeção é mais agressiva quando você usa o recurso Gerar Mensagem de Commit do VS Code — o ícone de faísca (✨) na barra lateral de Controle de Fonte. Clique nele, o Copilot rascunha uma mensagem, e o trailer de co-autor é incluído antes mesmo de você confirmar. Mas relatos de desenvolvedores confirmam que ele também aparece em commits onde a mensagem foi escrita manualmente, especialmente se o Copilot Chat estava ativo na sessão e havia sido usado para gerar algum código nos arquivos em stage.
O Mecanismo por Trás da Injeção
A extensão Copilot do VS Code integra-se com a API do Source Control Manager (SCM) do VS Code em um nível baixo. Quando você adiciona arquivos ao stage e abre a caixa de entrada de mensagem de commit, o Copilot se registra como um provedor de caixa de entrada do SCM e pode pré-preencher ou modificar esse campo de texto — incluindo a adição de trailers programaticamente antes de você digitar um único caractere.
Isso não é um recurso desonesto. É um comportamento documentado ligado à filosofia de atribuição de IA do GitHub: se um modelo de IA contribuiu substancialmente para uma parte do trabalho, o GitHub acredita que essa contribuição deve ser registrada. O problema é a execução: "contribuiu substancialmente" foi interpretado de forma muito ampla pela extensão, e a UX de opt-out está enterrada em vários menus em vez de ser um prompt proeminente na primeira execução.
Como a API SCM do VS Code Permite Isso
O VS Code expõe vscode.scm.inputBox e APIs relacionadas que as extensões podem usar. A extensão Copilot usa isso para:
- Observar quais arquivos estão em stage e seus diffs.
- Determinar se o Copilot foi invocado (ou simplesmente estava ativo) durante a edição desses arquivos.
- Gerar uma mensagem de commit via a API do Copilot.
- Injetar a mensagem — incluindo o trailer — no campo de entrada de commit antes do envio.
A injeção acontece no lado do cliente no VS Code, não nos servidores do GitHub, o que significa que regras do lado do servidor ou proteções de branch não conseguem interceptá-la antes que entre no seu histórico.
Acontece Sem Usar o Recurso de Geração?
Sim — e essa é a parte que mais frustra os desenvolvedores. Usuários relatam o trailer aparecendo mesmo quando:
- Escreveram a mensagem de commit manualmente (não via o botão de faísca).
- As alterações em stage foram 100% digitadas à mão.
- O Copilot Chat estava aberto mas não foi consultado para a tarefa atual.
A heurística da extensão para "o Copilot estava envolvido" é frouxa. Se o Copilot estava ativo durante a sessão de edição de qualquer arquivo no diff — mesmo que você tenha descartado todas as sugestões — ele ainda pode anexar o trailer. Esse é o cerne da reclamação: não é atribuição por contribuição real de IA, é atribuição por proximidade.
Por Que Isso Importa Além da Estética
Um co-autor fantasma no seu git log pode parecer uma irritação cosmética, mas há consequências reais downstream que vale entender antes de decidir com que urgência agir.
Propriedade Intelectual e Políticas de Empregadores
Muitos empregadores — particularmente em setores regulados como finanças, saúde e contratos de defesa — têm políticas explícitas de PI sobre código gerado por IA. Uma linha Co-authored-by: GitHub Copilot em um commit de uma base de código proprietária é um registro documentado de que ferramentas de IA estiveram envolvidas na criação daquele código. Mesmo que o Copilot tenha apenas autocompletado um colchete de fechamento, esse trailer cria uma trilha de auditoria que as equipes jurídicas podem precisar abordar.
Se sua empresa não aprovou explicitamente o uso do Copilot para código de produção, esse trailer é um passivo que você não assinou.
Implicações de Licenciamento Open-Source
O status legal do código gerado por IA e sua compatibilidade com licenças copyleft (GPL, AGPL) ainda não está definido. Projetos com políticas rígidas de contribuição podem rejeitar ou exigir reescritas do histórico para commits que incluem atribuição ao Copilot — a FSF e outras organizações publicaram posições sobre isso. Se você mantém um projeto open-source com contribuidores que esperam proveniência limpa, trailers do Copilot no seu histórico complicam isso.
Estatísticas de Contribuidores e Portfólios de Contratação
Perfis do GitHub e gráficos de contribuição são cada vez mais usados como portfólios informais — por recrutadores, potenciais colaboradores e comitês de programas de conferências. Ter um bot listado como co-autor em commits nos seus repositórios públicos embaralha o sinal de atribuição que esses gráficos pretendem fornecer. É uma coisa pequena, mas é o seu histórico.
Quatro Maneiras de Impedir
Não existe uma correção canônica única que funcione para todos os fluxos de trabalho. A abordagem certa depende se você quer uma solução global, uma substituição por repositório ou algo que preserve a geração de mensagens de commit do Copilot mas remova apenas o trailer.
Opção 1 — Configurações da Extensão do VS Code
A rota mais direta é desabilitar o comportamento nas configurações do VS Code. Abra as configurações (Ctrl+, ou Cmd+,), depois pesquise por "copilot commit". Você está procurando opções sob a extensão GitHub Copilot relacionadas à geração de mensagens de commit e atribuição de co-autor.
No settings.json, o caminho de configuração relevante fica assim:
{
"github.copilot.chat.generateCommitMessage.enabled": false
}
Desabilitar completamente a geração de mensagens de commit interrompe a injeção na fonte — o Copilot não preencherá o campo de entrada de commit de forma alguma, então não há oportunidade de anexar o trailer. Se você ainda quer mensagens de commit assistidas por IA mas sem a linha de atribuição, algumas versões da extensão expõem um toggle separado especificamente para o trailer de co-autor. Navegue até Extensões > GitHub Copilot > Configurações na barra lateral do VS Code para verificar o que está disponível na sua versão instalada, pois os nomes exatos das configurações mudaram entre as versões da extensão Copilot.
Opção 2 — Git Hook (Mais Confiável)
Um hook prepare-commit-msg é executado automaticamente antes que o editor de mensagem de commit seja aberto, e pode remover cirurgicamente o trailer do Copilot independentemente de como ele chegou lá. Essa abordagem funciona independentemente do VS Code, sobrevive a atualizações de extensão e se aplica a qualquer cliente git que você use no repositório.
Crie o arquivo de hook em .git/hooks/prepare-commit-msg:
#!/bin/sh
# Strip GitHub Copilot co-author trailer from commit messages
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"
Depois torne-o executável:
chmod +x .git/hooks/prepare-commit-msg
Para uma solução em equipe, use um diretório de hooks compartilhado versionado no repositório e configure o git para usá-lo:
# In .gitconfig or the repo's local config
git config core.hooksPath .githooks
Depois faça o commit do seu hook em .githooks/prepare-commit-msg com o mesmo conteúdo acima. Todo desenvolvedor que clonar o repositório e executar git config core.hooksPath .githooks (ou se você automatizar isso em um script de configuração) terá o comportamento de remoção aplicado.
-i no sed edita o arquivo no lugar. No macOS, o sed BSD requer uma extensão de backup explícita: sed -i '' '/^Co-authored-by: GitHub Copilot/Id' "$1". Adicione uma condicional shell se sua equipe usa Linux e macOS.Opção 3 — Desabilitar o Copilot por Workspace
Se sua preocupação é específica de um repositório (por exemplo, um projeto de cliente ou um repositório open-source com regras rígidas de proveniência), você pode desabilitar o Copilot completamente para aquele workspace sem tocar na sua configuração global. Na raiz do repositório, crie ou edite .vscode/settings.json:
{
"github.copilot.enable": {
"*": false
}
}
Isso desabilita todos os recursos do Copilot — autocompletar, chat e geração de mensagens de commit — somente naquele workspace. Quando você muda para um projeto pessoal, o Copilot se comporta normalmente. A desvantagem é que você perde toda a assistência do Copilot naquele repositório, não apenas a injeção de co-autor.
Opção 4 — Regra de Limpeza no gitconfig Global
Se você está vendo o trailer vazando para commits de múltiplas ferramentas e ambientes (não apenas VS Code), um hook global prepare-commit-msg no diretório home com o template git cobre tudo:
# Set a global hooks template directory
git config --global init.templateDir ~/.git-templates
# Create the directory and hook
mkdir -p ~/.git-templates/hooks
cat > ~/.git-templates/hooks/prepare-commit-msg << 'EOF'
#!/bin/sh
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"
EOF
chmod +x ~/.git-templates/hooks/prepare-commit-msg
Qualquer novo repositório que você inicializar ou clonar após esse ponto herdará automaticamente esse hook. Para repositórios existentes, execute git init na raiz do repositório — é seguro em repositórios existentes e copiará os hooks do template sem tocar no seu histórico.
Comparando Suas Opções
| Método | Escopo | Remove Trailer | Preserva Autocompletar | Compartilhável com Equipe | Sobrevive a Atualizações |
|---|---|---|---|---|---|
| Configuração do VS Code (desabilitar geração) | Global ou workspace | Sim | Não | Via commit do settings.json | Sim |
Hook prepare-commit-msg (local) |
Por repositório | Sim | Sim | Via padrão .githooks/ |
Sim |
Desabilitar workspace (copilot.enable) |
Por repositório | Sim | Não | Via .vscode/settings.json |
Sim |
| Hook de template git global | Todos os repos (novos + futuros) | Sim | Sim | Não (nível de usuário) | Sim |
| Desabilitar extensão Copilot completamente | Global | Sim | Não | N/A | N/A |
Melhor para indivíduos que querem manter o autocompletar do Copilot: hook prepare-commit-msg + template global.
Melhor para equipes com políticas compartilhadas: Diretório .githooks/ versionado com documentação de configuração.
Melhor para repositórios de clientes sensíveis: copilot.enable: false no nível do workspace versionado em .vscode/settings.json.
Limpando Commits Que Já Têm o Trailer
Se você já enviou commits com o trailer do Copilot para um repositório privado e quer limpar o histórico, a operação requer uma reescrita forçada. Faça isso somente em branches onde você é o único contribuidor e entende as consequências de alterar os SHAs dos commits.
# Interactive rebase to edit recent commits
git rebase -i HEAD~10
# For each offending commit, mark it 'reword' then remove the trailer line
# Or use filter-branch for bulk cleaning:
git filter-branch --msg-filter \
'sed "/^Co-authored-by: GitHub Copilot/Id"' \
HEAD~20..HEAD
Após a reescrita, você precisará forçar o push:
git push --force-with-lease origin your-branch
--force-with-lease é mais seguro que --force porque se recusará a enviar se alguém mais tiver feito push para o branch desde seu último fetch. Não protegerá branches públicos compartilhados — coordene com sua equipe antes de fazer isso em qualquer coisa que não seja um branch de feature pessoal.Para repositórios já enviados ao GitHub público onde você não quer reescrever o histórico, a resposta pragmática é: documente a situação no arquivo CONTRIBUTING do seu projeto, adicione um hook daqui para frente e aceite que os commits antigos são o que são. Reescritas de histórico em repositórios públicos ativos causam mais problemas do que resolvem.
Lista de Verificação Rápida
Percorra esses em ordem com base na sua situação:
- Confirme que está vendo o trailer: Execute
git log --format=full -5e verifique se háCo-authored-by: GitHub Copilotno final do corpo de algum commit. - Instale o hook
prepare-commit-msgno repositório afetado — esta é a correção de menor fricção e maior confiabilidade. - Verifique suas configurações do Copilot no VS Code: Abra as configurações, pesquise "copilot commit" e desabilite a geração de mensagens de commit se não usa o botão de faísca.
- Para repositórios sensíveis: Adicione um
.vscode/settings.jsonque desabilite o Copilot para aquele workspace e faça o commit para que os colegas herdem a configuração. - Para ambientes de equipe: Crie um diretório
.githooks/, adicione o scriptprepare-commit-msg, faça o commit e acrescentegit config core.hooksPath .githooksàs instruções de configuração do seu projeto ou Makefile. - Configure o template git global se trabalha em muitos repositórios pessoais e quer uma cobertura configurar-e-esquecer.
- Audite commits recentes em branches compartilhados: Use
git log --grep="Co-authored-by: GitHub Copilot" --onelinepara encontrar commits afetados antes de decidir se a limpeza do histórico é justificada. - Verifique se a correção funciona: Adicione um arquivo ao stage, deixe o VS Code abrir o diálogo de commit e confira se o trailer está ausente antes de confirmar o commit.
Fontes e Leitura Adicional
-
GitHub Docs — Atribuição por Trailer de Commit — Documentação oficial do GitHub sobre como os trailers de co-autor funcionam dentro do gráfico de contribuição do GitHub e o que o formato
Co-authored-bysignifica para estatísticas de repositório e atribuição de pull request. -
Changelog da Extensão GitHub Copilot do VS Code (marketplace.visualstudio.com) — As notas de versão da extensão Copilot documentam quando a geração de mensagens de commit foi introduzida e mudanças subsequentes no comportamento de atribuição; pesquise por versões do final de 2023 em diante.
-
git-scm.com — Documentação de githooks — A referência autoritativa para o hook
prepare-commit-msg, seu contexto de invocação, argumentos e como interage com o processo de commit em diferentes clientes git. -
Software Freedom Conservancy — Copyleft e Código Gerado por IA — A análise publicada pelo SFC sobre como os resultados de modelos de IA interagem com as obrigações de licenciamento GPL e AGPL, relevante para mantenedores de projetos open-source que decidem como lidar com a atribuição ao Copilot em seus projetos.
-
Fórum da Comunidade GitHub — "Copilot adicionando Co-authored-by sem minha entrada" — Threads de discussão contínuas de desenvolvedores documentando casos do mundo real do comportamento de injeção, soluções alternativas confirmadas por usuários e respostas da equipe do GitHub sobre o design pretendido versus casos extremos relatados.