VS Code Aggiunge "Co-Authored-by Copilot" a Ogni Commit
L'estensione Copilot di VS Code inietta silenziosamente un trailer Co-Authored-by nei tuoi commit — anche quando hai scritto ogni riga tu stesso. Ecco esattamente come fermarlo.
Co-authored-by: GitHub Copilot ai messaggi di commit ogni volta che è coinvolta nella loro generazione — e a volte anche quando non lo è. Questo influisce sui record di attribuzione, sulle cronologie dei contributi open-source e potenzialmente sulle politiche IP dei datori di lavoro. Puoi neutralizzarlo con un git hook, una modifica alle impostazioni di VS Code, o una regola nel gitconfig globale — ciascuna con diversi compromessi.Se hai dato un'occhiata al tuo git log di recente e hai notato una riga sconosciuta in fondo ai messaggi di commit che hai scritto interamente tu, non ti stai immaginando nulla. GitHub Copilot — o più precisamente, l'estensione Copilot di VS Code — sta silenziosamente apponendo il proprio nome ai commit come co-autore, indipendentemente dal fatto che abbia toccato una singola riga in quel push. Non è una cospirazione; è un sistema di attribuzione con opt-out predefinito a cui la maggior parte degli sviluppatori non ha mai consapevolmente acconsentito. Quello che segue è un'analisi precisa di come funziona l'iniezione, perché GitHub l'ha costruita in questo modo, e — soprattutto — esattamente quali impostazioni, hook e configurazioni la faranno smettere.
Come Appare il Trailer
Prima di correggere qualsiasi cosa, è utile sapere esattamente con cosa hai a che fare. Il testo iniettato è un trailer standard di git commit — una coppia chiave-valore aggiunta dopo una riga vuota alla fine del corpo del messaggio di commit. Segue lo stesso formato usato da git interpret-trailers e strumenti come Gerrit e la stessa infrastruttura di merge di 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>
Quest'ultima riga è ciò che Copilot inietta. L'indirizzo email github-copilot[bot]@users.noreply.github.com è un vero account bot di GitHub, il che significa che il grafo dei contributi e il motore di attribuzione dei commit di GitHub lo registra effettivamente come una co-autorship — non un commento, non metadati che puoi ignorare. È un oggetto git di prima classe incorporato nella cronologia dei tuoi commit in modo permanente una volta eseguito il push.
Dove Appare
- Vista commit di GitHub: Il commit mostrerà un badge "Co-authored by GitHub Copilot" accanto al tuo avatar.
git log --format=full: Il trailer appare nel corpo completo del commit.git shortlog: A seconda del parsing, Copilot potrebbe comparire come contributore nelle statistiche del progetto.- Grafo dei contributori di GitHub: L'account bot può registrarsi come contributore nel tuo repository.
git rebase -i o git filter-branch) per rimuoverlo è un'operazione distruttiva che richiederà un force-push e distruggerà le cronologie locali dei tuoi colleghi. La prevenzione è significativamente più semplice della remediation.Il Commit in Cui È Più Probabile che Appaia
L'iniezione è più aggressiva quando si usa la funzionalità Generate Commit Message di VS Code — l'icona sparkle (✨) nella sidebar di Source Control. Cliccaci sopra, Copilot redige un messaggio, e il trailer co-autore è già incluso prima ancora che tu confermi. Ma le segnalazioni degli sviluppatori confermano che appare anche in commit in cui il messaggio è stato scritto manualmente, in particolare se Copilot Chat era attivo durante quella sessione ed era stato usato per generare codice nei file in staging.
Il Meccanismo Dietro l'Iniezione
L'estensione Copilot di VS Code si integra con le API Source Control Manager (SCM) di VS Code a basso livello. Quando metti in staging dei file e apri il campo di inserimento del messaggio di commit, Copilot si registra come provider della casella di input SCM e può pre-popolare o modificare quel campo di testo — inclusa l'aggiunta programmatica di trailer prima ancora che tu abbia digitato un singolo carattere.
Non è una funzionalità fuori controllo. È un comportamento documentato legato alla filosofia di attribuzione AI di GitHub: se un modello AI ha contribuito sostanzialmente a un lavoro, GitHub ritiene che tale contributo debba essere registrato. Il problema è nell'esecuzione: "contribuito sostanzialmente" è stato interpretato in modo molto ampio dall'estensione, e l'UX di opt-out è sepolta in diversi menu piuttosto che essere una prominente richiesta al primo avvio.
Come l'API SCM di VS Code Lo Rende Possibile
VS Code espone vscode.scm.inputBox e le relative API che le estensioni possono agganciare. L'estensione Copilot usa questo per:
- Osservare quali file sono in staging e i loro diff.
- Determinare se Copilot è stato invocato (o semplicemente attivo) durante la modifica di quei file.
- Generare un messaggio di commit tramite l'API di Copilot.
- Iniettare il messaggio — incluso il trailer — nel campo di input del commit prima dell'invio.
L'iniezione avviene lato client in VS Code, non sui server di GitHub, il che significa che regole lato server o protezioni dei branch non possono intercettarla prima che entri nella tua cronologia.
Avviene Anche Senza Usare la Funzione Generate?
Sì — e questa è la parte che frustra di più gli sviluppatori. Gli utenti segnalano che il trailer appare anche quando:
- Hanno scritto il messaggio di commit manualmente (non tramite il pulsante sparkle).
- Le modifiche in staging erano scritte al 100% a mano.
- Copilot Chat era aperto ma non consultato per il task corrente.
L'euristica dell'estensione per "Copilot era coinvolto" è approssimativa. Se Copilot era attivo durante la sessione di modifica per qualsiasi file nel diff — anche se hai rifiutato ogni suggerimento — potrebbe comunque aggiungere il trailer. Questo è il nocciolo del problema: non è attribuzione per un contributo AI effettivo, è attribuzione per prossimità.
Perché la Questione Va Oltre l'Estetica
Un co-autore fantasma nel tuo git log potrebbe sembrare un fastidio estetico, ma ci sono conseguenze reali a valle da comprendere prima di decidere con quale urgenza agire.
Proprietà Intellettuale e Politiche Aziendali
Molti datori di lavoro — in particolare nei settori regolamentati come finanza, sanità e difesa — hanno politiche esplicite sulla IP riguardanti il codice generato dall'AI. Una riga Co-authored-by: GitHub Copilot in un commit su una codebase proprietaria è una prova documentata che gli strumenti AI sono stati coinvolti nella creazione di quel codice. Anche se Copilot ha solo completato automaticamente una parentesi di chiusura, quel trailer crea un audit trail che i team legali potrebbero dover gestire.
Se la tua azienda non ha esplicitamente autorizzato l'uso di Copilot per il codice di produzione, questo trailer è una responsabilità a cui non hai acconsentito.
Implicazioni per le Licenze Open-Source
Lo stato giuridico del codice generato dall'AI e la sua compatibilità con le licenze copyleft (GPL, AGPL) è ancora irrisolto. I progetti con politiche di contribuzione rigide potrebbero rifiutare o richiedere la riscrittura della cronologia per commit che includono attribuzioni Copilot — la FSF e altre organizzazioni hanno pubblicato posizioni in merito. Se stai mantenendo un progetto open-source con contributori che si aspettano una provenienza pulita, i trailer Copilot nella tua cronologia complicano le cose.
Statistiche dei Contributori e Portfolio Professionale
I profili GitHub e i grafi dei contributi sono sempre più usati come portfolio informali — da recruiter, potenziali collaboratori, comitati di selezione delle conferenze. Avere un bot elencato come co-autore nei commit dei tuoi repository pubblici inquina il segnale di attribuzione che quei grafi sono destinati a fornire. È una cosa piccola, ma è la tua cronologia.
Quattro Modi per Fermarlo
Non esiste un'unica soluzione canonica che funzioni per ogni workflow. L'approccio giusto dipende da se vuoi una soluzione globale, un override per repository, o qualcosa che mantenga la generazione dei messaggi di commit di Copilot ma rimuova solo il trailer.
Opzione 1 — Impostazioni dell'Estensione VS Code
Il percorso più diretto è disabilitare il comportamento dalle impostazioni di VS Code. Apri le impostazioni (Ctrl+, o Cmd+,), poi cerca "copilot commit". Stai cercando opzioni sotto l'estensione GitHub Copilot relative alla generazione dei messaggi di commit e all'attribuzione co-autore.
In settings.json, il percorso di configurazione rilevante è il seguente:
{
"github.copilot.chat.generateCommitMessage.enabled": false
}
Disabilitare completamente la generazione dei messaggi di commit blocca l'iniezione alla fonte — Copilot non popolerà affatto il campo di input del commit, quindi non c'è opportunità di aggiungere il trailer. Se vuoi ancora messaggi di commit assistiti dall'AI ma senza la riga di attribuzione, alcune versioni dell'estensione espongono un toggle separato specificamente per il trailer co-autore. Vai su Extensions > GitHub Copilot > Settings nella sidebar di VS Code per verificare cosa è disponibile nella tua versione installata, poiché i nomi esatti delle impostazioni sono cambiati nelle varie versioni dell'estensione Copilot.
Opzione 2 — Git Hook (La Più Affidabile)
Un hook prepare-commit-msg viene eseguito automaticamente prima che si apra l'editor del messaggio di commit, e può rimuovere chirurgicamente il trailer Copilot indipendentemente da come ci è arrivato. Questo approccio funziona indipendentemente da VS Code, sopravvive agli aggiornamenti dell'estensione e si applica a qualsiasi client git che usi nel repository.
Crea il file hook in .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"
Poi rendilo eseguibile:
chmod +x .git/hooks/prepare-commit-msg
Per una soluzione a livello di team, usa una directory di hook condivisa inclusa nel repository e configura git per usarla:
# In .gitconfig or the repo's local config
git config core.hooksPath .githooks
Poi salva il tuo hook in .githooks/prepare-commit-msg con lo stesso contenuto di cui sopra. Ogni sviluppatore che clona il repository ed esegue git config core.hooksPath .githooks (o se automatizzi questo in uno script di setup) avrà il comportamento di rimozione applicato.
-i su sed modifica il file in-place. Su macOS, il sed BSD richiede un'estensione di backup esplicita: sed -i '' '/^Co-authored-by: GitHub Copilot/Id' "$1". Aggiungi un condizionale shell se il tuo team usa sia Linux che macOS.Opzione 3 — Disabilitare Copilot per Workspace
Se la tua preoccupazione riguarda un repository specifico (ad es. un progetto cliente o un repository open-source con regole di provenienza rigide), puoi disabilitare Copilot completamente per quel workspace senza toccare la configurazione globale. Nella root del repository, crea o modifica .vscode/settings.json:
{
"github.copilot.enable": {
"*": false
}
}
Questo disabilita tutte le funzionalità di Copilot — completamenti, chat e generazione dei messaggi di commit — solo in quel workspace. Quando passi a un progetto personale, Copilot funziona normalmente. Il lato negativo è che perdi tutta l'assistenza di Copilot in quel repository, non solo l'iniezione del co-autore.
Opzione 4 — Regola di Pulizia nel gitconfig Globale
Se vedi il trailer comparire nei commit da più strumenti e ambienti (non solo VS Code), un hook prepare-commit-msg globale nella directory template git della tua home directory copre tutto:
# 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
Qualsiasi nuovo repository che inizializzi o cloni da questo momento in poi erediterà automaticamente questo hook. Per i repository esistenti, esegui git init nella root del repository — è sicuro sui repository esistenti e copierà gli hook del template senza toccare la tua cronologia.
Confronto delle Opzioni
| Metodo | Portata | Rimuove il Trailer | Mantiene i Completamenti | Condivisibile con il Team | Sopravvive agli Aggiornamenti |
|---|---|---|---|---|---|
| Impostazione VS Code (disabilita gen) | Globale o workspace | Sì | No | Tramite commit di settings.json | Sì |
Hook prepare-commit-msg (locale) |
Per repository | Sì | Sì | Tramite pattern .githooks/ |
Sì |
Disabilita workspace (copilot.enable) |
Per repository | Sì | No | Tramite .vscode/settings.json |
Sì |
| Hook template git globale | Tutti i repo (nuovi e futuri) | Sì | Sì | No (livello utente) | Sì |
| Disabilita l'estensione Copilot | Globale | Sì | No | N/A | N/A |
Ideale per chi vuole mantenere i completamenti Copilot: hook prepare-commit-msg + template globale.
Ideale per team con politiche condivise: directory .githooks/ inclusa nel repository con documentazione di setup.
Ideale per repository cliente sensibili: copilot.enable: false a livello di workspace incluso in .vscode/settings.json.
Pulizia dei Commit Che Già Ce L'Hanno
Se hai già eseguito il push di commit con il trailer Copilot su un repository privato e vuoi pulire la cronologia, l'operazione richiede una riscrittura forzata. Fallo solo su branch in cui sei l'unico contributore e comprendi le conseguenze del cambiamento degli SHA dei commit.
# 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
Dopo la riscrittura, dovrai fare un force-push:
git push --force-with-lease origin your-branch
--force-with-lease è più sicuro di --force perché si rifiuterà di eseguire il push se qualcun altro ha pushato sul branch dal tuo ultimo fetch. Non protegge i branch condivisi pubblici — coordinati con il tuo team prima di fare questo su qualsiasi cosa che non sia un feature branch personale.Per i repository già pushati su GitHub pubblico dove non vuoi riscrivere la cronologia, la risposta pragmatica è: documenta la situazione nel file CONTRIBUTING del tuo progetto, aggiungi un hook per il futuro, e accetta che i vecchi commit sono quello che sono. Le riscritture della cronologia su repository pubblici attivi causano più problemi di quanti ne risolvano.
Checklist Rapida
Procedi in ordine in base alla tua situazione:
- Conferma di vedere il trailer: Esegui
git log --format=full -5e controlla la presenza diCo-authored-by: GitHub Copilotin fondo al corpo di qualsiasi commit. - Installa l'hook
prepare-commit-msgnel repository interessato — questa è la soluzione a minor attrito e massima affidabilità. - Controlla le impostazioni Copilot di VS Code: Apri le impostazioni, cerca "copilot commit" e disabilita la generazione dei messaggi di commit se non usi il pulsante sparkle.
- Per i repository sensibili: Aggiungi un
.vscode/settings.jsonche disabilita Copilot per quel workspace e includilo nel repository in modo che i colleghi ereditino l'impostazione. - Per ambienti di team: Crea una directory
.githooks/, aggiungi lo scriptprepare-commit-msg, includila nel repository e aggiungigit config core.hooksPath .githooksalle istruzioni di setup del progetto o al Makefile. - Imposta il template git globale se lavori su molti repository personali e vuoi una copertura configurala-e-dimenticala.
- Controlla i commit recenti sui branch condivisi: Usa
git log --grep="Co-authored-by: GitHub Copilot" --onelineper trovare i commit interessati prima di decidere se la pulizia della cronologia è giustificata. - Verifica che la correzione funzioni: Metti in staging un file, lascia che VS Code apra il dialogo di commit, verifica che il trailer sia assente prima di confermare il commit.
Fonti e Letture Aggiuntive
-
GitHub Docs — Commit Trailer Attribution — La documentazione ufficiale di GitHub su come funzionano i trailer co-autore all'interno del grafo dei contributi di GitHub e cosa significa il formato
Co-authored-byper le statistiche del repository e l'attribuzione delle pull request. -
Changelog dell'Estensione VS Code GitHub Copilot (marketplace.visualstudio.com) — Le note di rilascio dell'estensione Copilot documentano quando è stata introdotta la generazione dei messaggi di commit e le successive modifiche al comportamento di attribuzione; cerca versioni dalla fine del 2023 in poi.
-
git-scm.com — Documentazione githooks — Il riferimento autorevole per l'hook
prepare-commit-msg, il suo contesto di invocazione, gli argomenti e come interagisce con il processo di commit su diversi client git. -
Software Freedom Conservancy — Copyleft e Codice Generato dall'AI — L'analisi pubblicata dalla SFC su come gli output dei modelli AI interagiscono con gli obblighi di licenza GPL e AGPL, rilevante per i maintainer open-source che decidono come gestire l'attribuzione Copilot nei loro progetti.
-
Forum della Community di GitHub — "Copilot aggiunge Co-authored-by senza il mio intervento" — Thread di discussione in corso che documentano casi reali del comportamento di iniezione, soluzioni alternative confermate dagli utenti e risposte dello staff di GitHub sul design previsto rispetto ai casi limite segnalati.