Computer screen displays "vibe vibe coding" text.

Apps

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.

TLDR Die VS Code-Erweiterung von GitHub Copilot hängt automatisch einen 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.

VS Code Quellcodeverwaltungs-Panel mit Copilot-Commit-Nachrichtengenerierung


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.
Warning Sobald du einen Commit mit diesem Trailer zu einem gemeinsamen Remote gepusht hast, ist das Umschreiben der Historie (über 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:

  1. Zu beobachten, welche Dateien gestagt sind und ihre Diffs.
  2. Zu bestimmen, ob Copilot beim Bearbeiten dieser Dateien aufgerufen (oder lediglich aktiv) war.
  3. Eine Commit-Nachricht über die Copilot-API zu generieren.
  4. 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.

Info Dieses Verhalten unterscheidet sich von GitHubs serverseitiger Copilot-Attributierung für Pull Requests. Was die VS Code-Erweiterung tut, ist eine clientseitige Textinjektion in das Commit-Nachrichtenfeld – ein völlig anderer Code-Pfad.

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.

Entwickler prüft Git-Log im Terminal mit co-authored Commits

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.

Warning Wenn du Freiberufler oder Berater bist und deine Kunden deine Git-Historie als Teil der Abnahme prüfen, könnte die Copilot-Attributierung in kundeneigenen Repositories Vertragsfragen aufwerfen, auf die du gerne verzichten würdest.

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.

Tip Die VS Code-Einstellungsoberfläche zeigt dir die aktuelle Erweiterungsversion neben ihren Einstellungen an. Wenn du einen älteren Copilot-Build verwendest, könnte ein Update der Erweiterung dir feinkörnigere Steuerungsmöglichkeiten für das Attributierungsverhalten geben – Microsoft hat auf das Community-Feedback dazu reagiert.

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.

Info Das -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
Warning --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.

GitHub-Repository-Einstellungen mit Branch-Schutzregeln


Schnell-Checkliste

Arbeite diese der Reihe nach durch, je nach deiner Situation:

  1. Bestätige, dass du den Trailer siehst: Führe git log --format=full -5 aus und prüfe, ob Co-authored-by: GitHub Copilot am Ende eines Commit-Texts erscheint.
  2. Installiere den prepare-commit-msg-Hook im betroffenen Repository – das ist die reibungsloseste und zuverlässigste Lösung.
  3. Ü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.
  4. Für sensible Repositories: Füge eine .vscode/settings.json hinzu, die Copilot für diesen Workspace deaktiviert, und checke sie ein, damit Teammitglieder die Einstellung erben.
  5. Für Team-Umgebungen: Erstelle ein .githooks/-Verzeichnis, füge das prepare-commit-msg-Skript hinzu, checke es ein und füge git config core.hooksPath .githooks zu den Setup-Anweisungen oder dem Makefile deines Projekts hinzu.
  6. Setze die globale Git-Vorlage, wenn du über viele persönliche Repos hinweg arbeitest und eine Einmal-einrichten-und-vergessen-Abdeckung möchtest.
  7. 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.
  8. Ü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.