VS Code fügt jedem Commit „Co-Authored-by Copilot" hinzu
Die Copilot-Erweiterung von VS Code fügt stillschweigend einen Co-Authored-by-Trailer in deine Commits ein – selbst wenn du jede Zeile selbst geschrieben hast. So kannst du es genau stoppen.
Co-authored-by: GitHub Copilot-Trailer an Commit-Nachrichten an – immer wenn sie an deren Erstellung beteiligt war, und manchmal sogar dann, wenn nicht. Das betrifft Autorenschaftsaufzeichnungen, Open-Source-Beitragshistorien und möglicherweise die IP-Richtlinien deines Arbeitgebers. Du kannst es mit einem Git-Hook, einer VS Code-Einstellungsänderung oder einer globalen gitconfig-Regel unterbinden – jede Option hat ihre eigenen Kompromisse.Wenn du kürzlich einen Blick in dein Git-Log geworfen und am Ende von Commit-Nachrichten, die du vollständig selbst verfasst hast, eine unbekannte Zeile entdeckt hast – du bildest dir das nicht ein. GitHub Copilot – oder genauer gesagt, die VS Code Copilot-Erweiterung – stempelt stillschweigend seinen Namen als Co-Autor auf Commits, unabhängig davon, ob er auch nur eine einzige Zeile in diesem Push berührt hat. Das ist keine Verschwörung; es ist ein standardmäßig aktives Opt-out-Attributierungssystem, dem die meisten Entwickler nie wissentlich zugestimmt haben. Es folgt eine präzise Aufschlüsselung, wie die Injektion funktioniert, warum GitHub es so gebaut hat – und was am nützlichsten ist: genau welche Einstellungen, Hooks und Konfigurationen dem ein Ende setzen.
Wie der Trailer tatsächlich aussieht
Bevor man etwas behebt, hilft es zu wissen, womit man es genau zu tun hat. Der eingefügte Text ist ein standardmäßiger Git-Commit-Trailer – ein Schlüssel-Wert-Paar, das nach einer Leerzeile am Ende des Commit-Nachrichtentexts angehängt wird. Er folgt demselben Format, das von git interpret-trailers und Tools wie Gerrit und GitHubs eigener Merge-Infrastruktur verwendet wird:
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>
Diese letzte Zeile ist das, was Copilot einfügt. Die E-Mail-Adresse github-copilot[bot]@users.noreply.github.com ist ein echtes GitHub-Bot-Konto, was bedeutet, dass GitHubs Beitragsgraph und die Commit-Attributierungs-Engine das tatsächlich als Co-Autorenschaft registriert – nicht als Kommentar, nicht als Metadaten, die du ignorieren kannst. Es ist ein erstklassiges Git-Objekt, das dauerhaft in deiner Commit-Historie eingebettet ist, sobald es gepusht wurde.
Wo er auftaucht
- GitHubs Commit-Ansicht: Der Commit zeigt neben deinem Avatar ein „Co-authored by GitHub Copilot"-Badge.
git log --format=full: Der Trailer erscheint im vollständigen Commit-Text.git shortlog: Je nach Auswertung kann Copilot als Beitragender in Projektstatistiken erscheinen.- GitHubs Beitragsgraph: Das Bot-Konto kann als Beitragender in deinem Repository registriert werden.
git rebase -i oder git filter-branch), um ihn zu entfernen, ein destruktiver Vorgang, der einen Force-Push erfordert und die lokalen Historien der Teammitglieder beschädigt. Vorbeugung ist deutlich einfacher als Nachbesserung.Der Commit, bei dem es am wahrscheinlichsten auftritt
Die Injektion ist am aggressivsten, wenn du VS Codes Commit-Nachricht generieren-Funktion verwendest – das Glitzerstern-Symbol (✨) in der Quellcodeverwaltungs-Seitenleiste. Klicke darauf, Copilot entwirft eine Nachricht, und der Co-Autor-Trailer wird eingebettet, bevor du überhaupt bestätigst. Doch Berichte von Entwicklern bestätigen, dass er auch bei Commits erscheint, bei denen die Nachricht manuell verfasst wurde – insbesondere wenn Copilot Chat in dieser Sitzung aktiv war und zur Generierung von Code in den gestagten Dateien verwendet wurde.
Der Mechanismus hinter der Injektion
Die VS Code-Erweiterung von GitHub Copilot integriert sich auf einer niedrigen Ebene in VS Codes Source Control Manager (SCM) API. Wenn du Dateien stagst und das Commit-Nachricht-Eingabefeld öffnest, registriert sich Copilot als SCM-Eingabefeld-Anbieter und kann dieses Textfeld vorausfüllen oder ändern – einschließlich des programmatischen Anhängens von Trailern, bevor du auch nur ein einziges Zeichen tippst.
Das ist kein Rogue-Feature. Es ist dokumentiertes Verhalten, das mit GitHubs KI-Attributierungsphilosophie verknüpft ist: Wenn ein KI-Modell wesentlich zu einem Werk beigetragen hat, sollte dieser Beitrag nach Ansicht von GitHub festgehalten werden. Das Problem liegt in der Umsetzung: „Wesentlich beigetragen" wird von der Erweiterung sehr weit ausgelegt, und das Opt-out-UX ist tief in Menüs vergraben, anstatt eine prominente Aufforderung beim ersten Start zu sein.
Wie VS Codes SCM API das ermöglicht
VS Code stellt vscode.scm.inputBox und verwandte APIs bereit, in die Erweiterungen einhaken können. Die Copilot-Erweiterung nutzt dies, um:
- Zu beobachten, welche Dateien gestagt sind und ihre Diffs.
- Zu bestimmen, ob Copilot beim Bearbeiten dieser Dateien aufgerufen (oder lediglich aktiv) war.
- Eine Commit-Nachricht über die Copilot-API zu generieren.
- Die Nachricht – einschließlich des Trailers – vor dem Absenden in das Commit-Eingabefeld einzufügen.
Die Injektion erfolgt clientseitig in VS Code, nicht auf GitHubs Servern – das bedeutet, dass serverseitige Regeln oder Branch-Schutzmechanismen sie nicht abfangen können, bevor sie in deine Historie gelangt.
Passiert es auch ohne Verwendung der Generierungs-Funktion?
Ja – und das ist der Teil, der Entwickler am meisten frustriert. Nutzer berichten, dass der Trailer selbst dann erscheint, wenn:
- Sie die Commit-Nachricht manuell verfasst haben (nicht über den Glitzerstern-Button).
- Die gestagten Änderungen zu 100 % manuell eingegeben wurden.
- Copilot Chat geöffnet, aber für die aktuelle Aufgabe nicht konsultiert wurde.
Die Heuristik der Erweiterung für „Copilot war beteiligt" ist locker. Wenn Copilot während der Bearbeitungssitzung für eine beliebige Datei im Diff aktiv war – selbst wenn du jeden Vorschlag abgelehnt hast – kann er den Trailer trotzdem anhängen. Das ist der Kern der Beschwerde: Es ist keine Attributierung für tatsächliche KI-Beiträge, sondern Attributierung durch bloße Nähe.
Warum das mehr als nur Kosmetik ist
Ein Geist-Co-Autor in deinem Git-Log mag wie ein kosmetisches Ärgernis erscheinen, aber es gibt reale nachgelagerte Konsequenzen, die es wert sind, sie zu verstehen, bevor du entscheidest, wie dringend du handeln musst.
Geistiges Eigentum und Arbeitgeberrichtlinien
Viele Arbeitgeber – insbesondere in regulierten Branchen wie Finanzen, Gesundheitswesen und Verteidigungsaufträgen – haben explizite IP-Richtlinien zu KI-generiertem Code. Eine Co-authored-by: GitHub Copilot-Zeile in einem Commit zu einer proprietären Codebasis ist ein dokumentierter Nachweis, dass KI-Werkzeuge an der Erstellung dieses Codes beteiligt waren. Selbst wenn Copilot nur eine schließende Klammer vervollständigt hat, schafft dieser Trailer eine Prüfspur, mit der sich Rechtsteams befassen müssen.
Wenn dein Unternehmen den Copilot-Einsatz für Produktionscode nicht ausdrücklich freigegeben hat, ist dieser Trailer eine Haftung, für die du dich nicht angemeldet hast.
Auswirkungen auf Open-Source-Lizenzen
Der Rechtsstatus von KI-generiertem Code und seine Kompatibilität mit Copyleft-Lizenzen (GPL, AGPL) ist noch ungeklärt. Projekte mit strengen Beitragsrichtlinien können Commits mit Copilot-Attributierung ablehnen oder eine Umschreibung der Historie verlangen – die FSF und andere Organisationen haben hierzu Stellungnahmen veröffentlicht. Wenn du ein Open-Source-Projekt pflegst, dessen Beitragende eine saubere Herkunft erwarten, erschweren Copilot-Trailer in deiner Historie das erheblich.
Beitragsstatistiken und Bewerbungsportfolios
GitHub-Profile und Beitragsgraphen werden zunehmend als informelle Portfolios genutzt – von Recruitern, potenziellen Mitarbeitenden und Konferenzprogrammkomitees. Wenn ein Bot als Co-Autor bei Commits in deinen öffentlichen Repositories aufgeführt wird, verwässert das das Attributierungssignal, das diese Graphen eigentlich liefern sollen. Es ist eine Kleinigkeit, aber es ist deine Geschichte.
Vier Wege, es zu stoppen
Es gibt keine einheitliche, kanonische Lösung, die für jeden Workflow funktioniert. Der richtige Ansatz hängt davon ab, ob du eine globale Lösung, eine Repository-spezifische Überschreibung oder etwas möchtest, das Copilots Commit-Nachrichtengenerierung beibehält, aber nur den Trailer entfernt.
Option 1 — VS Code-Erweiterungseinstellungen
Der direkteste Weg ist, das Verhalten über die VS Code-Einstellungen zu deaktivieren. Öffne die Einstellungen (Strg+, oder Cmd+,), suche dann nach „copilot commit". Du suchst nach Optionen unter der GitHub Copilot-Erweiterung, die mit der Commit-Nachrichtengenerierung und der Co-Autor-Attributierung zusammenhängen.
In settings.json sieht der relevante Konfigurationspfad folgendermaßen aus:
{
"github.copilot.chat.generateCommitMessage.enabled": false
}
Das vollständige Deaktivieren der Commit-Nachrichtengenerierung stoppt die Injektion an der Quelle – Copilot füllt das Commit-Eingabefeld überhaupt nicht aus, sodass keine Möglichkeit besteht, den Trailer anzuhängen. Wenn du weiterhin KI-unterstützte Commit-Nachrichten ohne die Attributierungszeile möchtest, bieten einige Versionen der Erweiterung einen separaten Schalter speziell für den Co-Autor-Trailer. Navigiere zu Erweiterungen > GitHub Copilot > Einstellungen in der VS Code-Seitenleiste, um zu prüfen, was in deiner installierten Version verfügbar ist – die genauen Einstellungsnamen haben sich über Copilot-Erweiterungsversionen hinweg geändert.
Option 2 — Git-Hook (Zuverlässigste Methode)
Ein prepare-commit-msg-Hook läuft automatisch, bevor der Commit-Nachrichten-Editor geöffnet wird, und kann den Copilot-Trailer chirurgisch präzise entfernen, unabhängig davon, wie er dort hingelangt ist. Dieser Ansatz funktioniert unabhängig von VS Code, überlebt Erweiterungsupdates und gilt für jeden Git-Client, den du im Repository verwendest.
Erstelle die Hook-Datei unter .git/hooks/prepare-commit-msg:
#!/bin/sh
# GitHub Copilot Co-Autor-Trailer aus Commit-Nachrichten entfernen
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"
Mache sie dann ausführbar:
chmod +x .git/hooks/prepare-commit-msg
Für eine teamweite Lösung verwende ein gemeinsames Hooks-Verzeichnis, das im Repository eingecheckt ist, und konfiguriere Git, es zu verwenden:
# In .gitconfig oder der lokalen Repo-Konfiguration
git config core.hooksPath .githooks
Committe dann deinen Hook in .githooks/prepare-commit-msg mit demselben Inhalt wie oben. Jeder Entwickler, der das Repo klont und git config core.hooksPath .githooks ausführt (oder wenn du das in einem Setup-Skript automatisierst), wird das Entfernungsverhalten angewendet bekommen.
-i-Flag bei sed bearbeitet die Datei in-place. Auf macOS erfordert BSD sed eine explizite Backup-Erweiterung: sed -i '' '/^Co-authored-by: GitHub Copilot/Id' "$1". Füge eine Shell-Bedingung hinzu, wenn dein Team sowohl Linux als auch macOS verwendet.Option 3 — Copilot pro Workspace deaktivieren
Wenn dein Anliegen repository-spezifisch ist (z. B. ein Kundenprojekt oder ein Open-Source-Repo mit strengen Herkunftsregeln), kannst du Copilot für diesen Workspace vollständig deaktivieren, ohne dein globales Setup zu berühren. Im Repository-Stammverzeichnis erstelle oder bearbeite .vscode/settings.json:
{
"github.copilot.enable": {
"*": false
}
}
Dies deaktiviert alle Copilot-Funktionen – Vervollständigungen, Chat und Commit-Nachrichtengenerierung – nur in diesem Workspace. Wenn du zu einem persönlichen Projekt wechselst, verhält sich Copilot normal. Der Nachteil ist, dass du alle Copilot-Unterstützung in diesem Repo verlierst, nicht nur die Co-Autor-Injektion.
Option 4 — Globale gitconfig-Bereinigungsregel
Wenn du siehst, dass der Trailer von mehreren Tools und Umgebungen (nicht nur VS Code) in Commits einsickert, deckt ein globaler prepare-commit-msg-Hook in der Git-Vorlage deines Home-Verzeichnisses alles ab:
# Globales Hooks-Template-Verzeichnis festlegen
git config --global init.templateDir ~/.git-templates
# Verzeichnis und Hook erstellen
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
Jedes neue Repository, das du nach diesem Zeitpunkt initialisierst oder klonst, erbt diesen Hook automatisch. Für bestehende Repositories führe git init im Repo-Stammverzeichnis aus – das ist sicher für bestehende Repos und kopiert die Vorlagen-Hooks, ohne deine Historie zu berühren.
Deine Optionen im Vergleich
| Methode | Geltungsbereich | Entfernt Trailer | Erhält Vervollständigungen | Teamfähig | Überlebt Erweiterungsupdates |
|---|---|---|---|---|---|
| VS Code-Einstellung (Gen. deaktivieren) | Global oder Workspace | Ja | Nein | Per settings.json-Commit | Ja |
prepare-commit-msg-Hook (lokal) |
Pro Repository | Ja | Ja | Per .githooks/-Muster |
Ja |
Workspace deaktivieren (copilot.enable) |
Pro Repository | Ja | Nein | Per .vscode/settings.json |
Ja |
| Globaler Git-Template-Hook | Alle Repos (neu + zukünftig) | Ja | Ja | Nein (Nutzerebene) | Ja |
| Copilot-Erweiterung vollständig deaktivieren | Global | Ja | Nein | Nicht zutreffend | Nicht zutreffend |
Ideal für Einzelpersonen, die Copilot-Vervollständigungen behalten möchten: prepare-commit-msg-Hook + globale Vorlage.
Ideal für Teams mit gemeinsamen Richtlinien: Eingechecktes .githooks/-Verzeichnis mit Setup-Dokumentation.
Ideal für sensible Kunden-Repos: Workspace-seitiges copilot.enable: false, eingecheckt in .vscode/settings.json.
Bereits vorhandene Commits bereinigen
Wenn du bereits Commits mit dem Copilot-Trailer in ein privates Repository gepusht hast und die Historie bereinigen möchtest, erfordert dieser Vorgang ein erzwungenes Umschreiben. Tue dies nur auf Branches, auf denen du der einzige Beitragende bist und du die Konsequenzen einer Änderung der Commit-SHAs verstehst.
# Interaktiver Rebase zum Bearbeiten aktueller Commits
git rebase -i HEAD~10
# Jeden betroffenen Commit mit 'reword' markieren und die Trailer-Zeile entfernen
# Oder filter-branch für eine Massenbereinigung verwenden:
git filter-branch --msg-filter \
'sed "/^Co-authored-by: GitHub Copilot/Id"' \
HEAD~20..HEAD
Nach dem Umschreiben musst du force-pushen:
git push --force-with-lease origin your-branch
--force-with-lease ist sicherer als --force, weil es den Push verweigert, wenn jemand anderes seit deinem letzten Fetch auf den Branch gepusht hat. Es schützt keine öffentlichen gemeinsamen Branches – koordiniere mit deinem Team, bevor du das auf etwas anderem als einem persönlichen Feature-Branch durchführst.Für Repositories, die bereits auf öffentlichem GitHub gepusht wurden und deren Historie du nicht umschreiben möchtest, ist die pragmatische Antwort: Dokumentiere die Situation in der CONTRIBUTING-Datei deines Projekts, füge einen Hook für die Zukunft hinzu und akzeptiere, dass die alten Commits das sind, was sie sind. Historieumschreibungen in aktiven öffentlichen Repos verursachen mehr Probleme, als sie lösen.
Schnell-Checkliste
Arbeite diese der Reihe nach durch, je nach deiner Situation:
- Bestätige, dass du den Trailer siehst: Führe
git log --format=full -5aus und prüfe, obCo-authored-by: GitHub Copilotam Ende eines Commit-Texts erscheint. - Installiere den
prepare-commit-msg-Hook im betroffenen Repository – das ist die reibungsloseste und zuverlässigste Lösung. - Überprüfe deine VS Code Copilot-Einstellungen: Öffne die Einstellungen, suche nach „copilot commit" und deaktiviere die Commit-Nachrichtengenerierung, wenn du den Glitzerstern-Button nicht verwendest.
- Für sensible Repositories: Füge eine
.vscode/settings.jsonhinzu, die Copilot für diesen Workspace deaktiviert, und checke sie ein, damit Teammitglieder die Einstellung erben. - Für Team-Umgebungen: Erstelle ein
.githooks/-Verzeichnis, füge dasprepare-commit-msg-Skript hinzu, checke es ein und fügegit config core.hooksPath .githookszu den Setup-Anweisungen oder dem Makefile deines Projekts hinzu. - Setze die globale Git-Vorlage, wenn du über viele persönliche Repos hinweg arbeitest und eine Einmal-einrichten-und-vergessen-Abdeckung möchtest.
- Prüfe aktuelle Commits auf gemeinsamen Branches: Verwende
git log --grep="Co-authored-by: GitHub Copilot" --oneline, um betroffene Commits zu finden, bevor du entscheidest, ob eine Historiebereinigung gerechtfertigt ist. - Überprüfe, ob die Lösung funktioniert: Stage eine Datei, lass VS Code den Commit-Dialog öffnen und prüfe, dass der Trailer fehlt, bevor du den Commit bestätigst.
Quellen & Weiterführende Lektüre
-
GitHub Docs — Commit-Trailer-Attributierung — GitHubs offizielle Dokumentation darüber, wie Co-Autor-Trailer im GitHub-Beitragsgraphen funktionieren und was das
Co-authored-by-Format für Repository-Statistiken und Pull-Request-Attributierung bedeutet. -
VS Code GitHub Copilot Extension Changelog (marketplace.visualstudio.com) — Die Release Notes der Copilot-Erweiterung dokumentieren, wann die Commit-Nachrichtengenerierung eingeführt wurde und spätere Änderungen am Attributierungsverhalten; suche nach Versionen ab Ende 2023.
-
git-scm.com — githooks-Dokumentation — Die maßgebliche Referenz für den
prepare-commit-msg-Hook, seinen Aufrufkontext, Argumente und wie er mit dem Commit-Prozess verschiedener Git-Clients interagiert. -
Software Freedom Conservancy — Copyleft und KI-generierter Code — Die veröffentlichte Analyse der SFC darüber, wie KI-Modell-Ausgaben mit GPL- und AGPL-Lizenzverpflichtungen interagieren, relevant für Open-Source-Maintainer, die entscheiden, wie sie mit Copilot-Attributierung in ihren Projekten umgehen.
-
GitHub Community Forum — „Copilot fügt Co-authored-by ohne meine Eingabe hinzu" — Laufende Entwicklerdiskussionen, die reale Fälle des Injektionsverhaltens, nutzerbewährte Workarounds und Antworten von GitHub-Mitarbeitern zum beabsichtigten Design im Vergleich zu gemeldeten Randfällen dokumentieren.