Computer screen displays "vibe vibe coding" text.

Apps

VS Code가 모든 커밋에 "Co-Authored-by Copilot"을 추가한다

VS Code의 Copilot 확장 프로그램은 사용자가 모든 코드를 직접 작성했더라도 커밋에 Co-Authored-by 트레일러를 조용히 삽입합니다. 이를 완전히 차단하는 정확한 방법을 알아보세요.

TLDR GitHub Copilot의 VS Code 확장 프로그램은 커밋 메시지 생성에 관여할 때마다 — 때로는 관여하지 않을 때도 — Co-authored-by: GitHub Copilot 트레일러를 자동으로 추가합니다. 이는 저작권 기록, 오픈 소스 기여 이력, 그리고 잠재적으로 고용주의 IP 정책에 영향을 미칩니다. git hook, VS Code 설정 변경, 또는 전역 gitconfig 규칙으로 이를 차단할 수 있으며, 각각 서로 다른 트레이드오프가 있습니다.

최근 git 로그를 확인하다가 본인이 직접 작성한 커밋 메시지 하단에 낯선 줄이 추가된 것을 발견했다면, 그것은 착각이 아닙니다. GitHub Copilot — 정확히는 VS Code Copilot 확장 프로그램 — 이 해당 푸시에서 단 한 줄도 건드리지 않았음에도 불구하고, 커밋에 공동 저자로 조용히 이름을 새기고 있습니다. 이는 음모가 아니라 대부분의 개발자가 인지하지 못한 채 동의하게 된 기본 opt-out 저작권 표시 시스템입니다. 이 글에서는 주입 방식이 어떻게 작동하는지, GitHub가 이렇게 설계한 이유는 무엇인지, 그리고 — 가장 중요하게 — 이를 멈추게 할 설정, hook, 구성 방법을 정확히 알아봅니다.

VS Code 소스 컨트롤 패널에서 Copilot 커밋 메시지 생성 화면


트레일러의 실제 모습

문제를 해결하기 전에, 정확히 무엇을 다루는지 파악하는 것이 좋습니다. 주입되는 텍스트는 표준 git 커밋 트레일러로, 커밋 메시지 본문 끝에 빈 줄 뒤에 추가되는 키-값 쌍입니다. 이는 git interpret-trailers와 Gerrit, GitHub 자체 merge 인프라에서 사용하는 것과 동일한 형식을 따릅니다:

feat: 사용자 인증 플로우 추가

리프레시 토큰 순환을 포함한 JWT 기반 로그인 구현.

Co-authored-by: GitHub Copilot <github-copilot[bot]@users.noreply.github.com>

마지막 줄이 Copilot이 삽입하는 내용입니다. 이메일 주소 github-copilot[bot]@users.noreply.github.com은 실제 GitHub 봇 계정으로, GitHub의 기여 그래프와 커밋 저작권 엔진이 이를 단순한 주석이나 무시 가능한 메타데이터가 아닌 공동 저작으로 실제로 등록합니다. 이는 한번 푸시되면 커밋 이력에 영구적으로 삽입되는 일급 git 객체입니다.

어디서 나타나는가

  • GitHub 커밋 뷰: 커밋에 사용자 아바타 옆에 "Co-authored by GitHub Copilot" 배지가 표시됩니다.
  • git log --format=full: 트레일러가 전체 커밋 본문에 나타납니다.
  • git shortlog: 파싱 방식에 따라 Copilot이 프로젝트 통계에 기여자로 표시될 수 있습니다.
  • GitHub 기여자 그래프: 봇 계정이 저장소의 기여자로 등록될 수 있습니다.
Warning 이 트레일러가 포함된 커밋을 공유 원격 저장소에 푸시한 후, git rebase -i 또는 git filter-branch를 통해 이를 제거하는 이력 재작성은 파괴적인 작업으로 팀원들의 로컬 이력을 강제 푸시로 깨뜨립니다. 사후 복구보다 사전 예방이 훨씬 쉽습니다.

가장 자주 나타나는 커밋 상황

주입은 VS Code의 커밋 메시지 생성 기능 — 소스 컨트롤 사이드바의 스파클(✨) 아이콘 — 을 사용할 때 가장 적극적으로 발생합니다. 클릭하면 Copilot이 메시지 초안을 작성하고, 사용자가 확인하기 전에 이미 공동 저자 트레일러가 함께 묶여 있습니다. 그러나 개발자들의 보고에 따르면 메시지를 수동으로 작성한 커밋에도 나타나는데, 특히 해당 세션에서 Copilot Chat이 활성화되어 있고 스테이징된 파일의 코드 생성에 사용된 경우에 그렇습니다.


주입 메커니즘

GitHub Copilot의 VS Code 확장 프로그램은 VS Code의 Source Control Manager(SCM) API와 낮은 수준에서 통합됩니다. 파일을 스테이징하고 커밋 메시지 입력창을 열면, Copilot이 SCM 입력 상자 프로바이더로 등록되어 사용자가 단 한 글자도 입력하기 전에 프로그래밍 방식으로 트레일러를 추가하는 것을 포함하여 해당 텍스트 필드를 미리 채우거나 수정할 수 있습니다.

이것은 악성 기능이 아닙니다. GitHub의 AI 저작권 철학과 연결된 문서화된 동작입니다: AI 모델이 작업에 상당히 기여했다면, GitHub는 그 기여가 기록되어야 한다고 믿습니다. 문제는 실행 방식입니다: "상당히 기여"의 기준이 확장 프로그램에 의해 매우 광범위하게 해석되어 왔고, opt-out UI가 눈에 잘 띄는 첫 실행 프롬프트가 아닌 여러 메뉴 깊숙이 숨겨져 있습니다.

VS Code의 SCM API가 이를 가능하게 하는 방법

VS Code는 확장 프로그램이 연결할 수 있는 vscode.scm.inputBox 및 관련 API를 제공합니다. Copilot 확장 프로그램은 이를 다음과 같이 사용합니다:

  1. 어떤 파일이 스테이징되어 있고 그 diff를 관찰합니다.
  2. 해당 파일 편집 중 Copilot이 호출되었는지 (또는 단순히 활성화되어 있었는지) 판단합니다.
  3. Copilot API를 통해 커밋 메시지를 생성합니다.
  4. 제출 전에 트레일러를 포함한 메시지를 커밋 입력 필드에 주입합니다.

주입은 GitHub 서버가 아닌 VS Code 클라이언트 측에서 발생하므로, 서버 측 규칙이나 브랜치 보호 규칙으로는 이력에 들어가기 전에 차단할 수 없습니다.

Info 이 동작은 풀 리퀘스트에 대한 GitHub의 서버 측 Copilot 저작권 표시와는 다릅니다. VS Code 확장 프로그램이 하는 것은 커밋 메시지 필드에 대한 클라이언트 측 텍스트 주입으로, 완전히 다른 코드 경로입니다.

생성 기능을 사용하지 않아도 발생하는가?

예 — 그리고 이것이 개발자들을 가장 좌절시키는 부분입니다. 다음과 같은 경우에도 트레일러가 나타났다는 보고가 있습니다:

  • 커밋 메시지를 수동으로 작성한 경우 (스파클 버튼 미사용).
  • 스테이징된 변경 사항이 100% 손으로 직접 타이핑한 경우.
  • Copilot Chat이 열려 있었지만 현재 작업에는 사용하지 않은 경우.

확장 프로그램의 "Copilot이 관여했다"는 휴리스틱은 느슨합니다. diff에 포함된 어떤 파일의 편집 세션 중에 Copilot이 활성화되어 있었다면 — 모든 제안을 무시했더라도 — 트레일러를 추가할 수 있습니다. 이것이 불만의 핵심입니다: 실제 AI 기여에 대한 저작권 표시가 아니라, 근접성에 의한 저작권 표시입니다.


미관 이상의 문제

git 로그에 유령 공동 저자가 있다는 것은 단순한 불편함처럼 보일 수 있지만, 얼마나 시급하게 대처해야 할지 결정하기 전에 이해해야 할 실질적인 후속 결과가 있습니다.

터미널에서 git 로그를 검토하며 공동 저작 커밋을 확인하는 개발자

지적 재산권과 고용주 정책

많은 고용주 — 특히 금융, 의료, 방위 산업 분야의 기업들 — 은 AI 생성 코드에 관한 명시적인 IP 정책을 가지고 있습니다. 독점 코드베이스의 커밋에 Co-authored-by: GitHub Copilot 줄이 있다는 것은 해당 코드 생성에 AI 도구가 관여했다는 문서화된 기록입니다. Copilot이 닫는 괄호 하나만 자동 완성했더라도, 그 트레일러는 법무팀이 다루어야 할 수 있는 감사 추적을 만듭니다.

회사가 프로덕션 코드에 대한 Copilot 사용을 명시적으로 허가하지 않았다면, 이 트레일러는 동의하지 않은 책임입니다.

오픈 소스 라이선스 관련 사항

AI 생성 코드의 법적 지위와 카피레프트 라이선스(GPL, AGPL)와의 호환성은 아직 해결되지 않은 문제입니다. 엄격한 기여 정책을 가진 프로젝트는 Copilot 저작권 표시가 포함된 커밋을 거부하거나 이력 재작성을 요구할 수 있습니다 — FSF와 다른 단체들이 이에 관한 입장을 발표했습니다. 깨끗한 출처를 기대하는 기여자가 있는 오픈 소스 프로젝트를 유지 관리하고 있다면, 이력의 Copilot 트레일러가 이를 복잡하게 만듭니다.

기여 통계와 취업 포트폴리오

GitHub 프로필과 기여 그래프는 채용 담당자, 잠재적 협업자, 컨퍼런스 프로그램 위원회 등이 비공식 포트폴리오로 점점 더 많이 활용하고 있습니다. 공개 저장소의 커밋에 봇이 공동 저자로 등재되면 해당 그래프가 제공하고자 하는 저작권 신호가 흐려집니다. 사소한 일이지만, 이것은 당신의 이력입니다.

Warning 프리랜서나 컨설턴트로서 클라이언트가 납품 검수의 일환으로 git 이력을 검토한다면, 클라이언트 소유 저장소에 Copilot 저작권 표시가 있을 경우 피하고 싶은 계약 관련 질문이 발생할 수 있습니다.

네 가지 차단 방법

모든 워크플로에 적용되는 단일 정식 해결책은 없습니다. 올바른 접근 방식은 전역 솔루션을 원하는지, 저장소별 재정의를 원하는지, 또는 Copilot의 커밋 메시지 생성은 유지하되 트레일러만 제거하는 방법을 원하는지에 따라 다릅니다.

방법 1 — VS Code 확장 프로그램 설정

가장 직접적인 방법은 VS Code 설정 내에서 동작을 비활성화하는 것입니다. 설정(Ctrl+, 또는 Cmd+,)을 열고 **"copilot commit"**을 검색합니다. GitHub Copilot 확장 프로그램 아래에서 커밋 메시지 생성 및 공동 저자 표시와 관련된 옵션을 찾습니다.

settings.json에서 관련 구성 경로는 다음과 같습니다:

{
  "github.copilot.chat.generateCommitMessage.enabled": false
}

커밋 메시지 생성을 완전히 비활성화하면 주입의 근원을 차단합니다 — Copilot이 커밋 입력 필드를 채우지 않으므로 트레일러를 추가할 기회 자체가 없어집니다. AI 보조 커밋 메시지는 사용하되 저작권 표시 줄만 없애고 싶다면, 일부 버전의 확장 프로그램에서는 공동 저자 트레일러에 대한 별도 토글을 제공합니다. VS Code 사이드바에서 확장 프로그램 > GitHub Copilot > 설정으로 이동하여 설치된 버전에서 사용 가능한 옵션을 확인하세요. 정확한 설정 이름은 Copilot 확장 프로그램 릴리스마다 변경되어 왔기 때문입니다.

Tip VS Code 설정 UI에는 현재 확장 프로그램 버전과 해당 설정이 함께 표시됩니다. 오래된 Copilot 빌드를 사용 중이라면 확장 프로그램을 업데이트하면 저작권 표시 동작에 대한 더 세밀한 제어 옵션이 생길 수 있습니다 — Microsoft가 이에 대한 커뮤니티 피드백에 응답해 왔기 때문입니다.

방법 2 — Git Hook (가장 신뢰할 수 있는 방법)

prepare-commit-msg hook은 커밋 메시지 편집기가 열리기 전에 자동으로 실행되며, 트레일러가 어떻게 들어왔든 관계없이 Copilot 트레일러를 외과적으로 제거할 수 있습니다. 이 접근 방식은 VS Code와 독립적으로 작동하고, 확장 프로그램 업데이트에도 유지되며, 저장소에서 사용하는 모든 git 클라이언트에 적용됩니다.

.git/hooks/prepare-commit-msg에 hook 파일을 생성합니다:

#!/bin/sh
# 커밋 메시지에서 GitHub Copilot 공동 저자 트레일러 제거
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"

그런 다음 실행 가능하게 만듭니다:

chmod +x .git/hooks/prepare-commit-msg

팀 전체 솔루션의 경우, 저장소에 커밋된 공유 hooks 디렉토리를 사용하고 git이 이를 사용하도록 구성합니다:

# .gitconfig 또는 저장소의 로컬 구성에서
git config core.hooksPath .githooks

그런 다음 위와 동일한 내용으로 .githooks/prepare-commit-msg에 hook을 커밋합니다. 저장소를 클론하고 git config core.hooksPath .githooks를 실행하는 모든 개발자(또는 설정 스크립트에서 자동화한 경우)는 제거 동작이 적용됩니다.

Info sed-i 플래그는 파일을 직접 편집합니다. macOS에서 BSD sed는 명시적인 백업 확장자가 필요합니다: sed -i '' '/^Co-authored-by: GitHub Copilot/Id' "$1". 팀이 Linux와 macOS를 모두 사용한다면 셸 조건문을 추가하세요.

방법 3 — 워크스페이스별 Copilot 비활성화

클라이언트 프로젝트나 엄격한 출처 규칙을 가진 오픈 소스 저장소 등 특정 저장소에 대한 우려가 있다면, 전역 설정을 건드리지 않고 해당 워크스페이스에서만 Copilot을 완전히 비활성화할 수 있습니다. 저장소 루트에서 .vscode/settings.json을 생성하거나 편집합니다:

{
  "github.copilot.enable": {
    "*": false
  }
}

이렇게 하면 해당 워크스페이스에서만 모든 Copilot 기능 — 자동 완성, 채팅, 커밋 메시지 생성 — 이 비활성화됩니다. 개인 프로젝트로 전환하면 Copilot이 정상적으로 작동합니다. 단점은 공동 저자 주입만이 아닌 해당 저장소에서의 모든 Copilot 지원을 잃게 된다는 것입니다.

방법 4 — 전역 gitconfig 정리 규칙

트레일러가 VS Code뿐만 아니라 여러 도구와 환경의 커밋에 유입되는 경우, 홈 디렉토리의 git 템플릿에 있는 전역 prepare-commit-msg hook이 모든 것을 커버합니다:

# 전역 hooks 템플릿 디렉토리 설정
git config --global init.templateDir ~/.git-templates

# 디렉토리와 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

이 시점 이후에 초기화하거나 클론하는 모든 새 저장소는 이 hook을 자동으로 상속받습니다. 기존 저장소의 경우, 저장소 루트에서 git init을 실행하세요 — 기존 저장소에서도 안전하며 이력을 건드리지 않고 템플릿 hook을 복사합니다.


방법 비교

방법 범위 트레일러 제거 자동 완성 유지 팀 공유 가능 확장 프로그램 업데이트 후 유지
VS Code 설정 (생성 비활성화) 전역 또는 워크스페이스 아니오 settings.json 커밋으로 가능
prepare-commit-msg hook (로컬) 저장소별 .githooks/ 패턴으로 가능
워크스페이스 비활성화 (copilot.enable) 저장소별 아니오 .vscode/settings.json으로 가능
전역 git 템플릿 hook 모든 저장소 (신규 + 이후) 아니오 (사용자 수준)
Copilot 확장 프로그램 완전 비활성화 전역 아니오 해당 없음 해당 없음

자동 완성을 유지하고 싶은 개인 사용자에게 최적: prepare-commit-msg hook + 전역 템플릿.

공유 정책이 있는 팀에게 최적: 설정 문서와 함께 커밋된 .githooks/ 디렉토리.

민감한 클라이언트 저장소에 최적: .vscode/settings.json에 커밋된 워크스페이스 수준의 copilot.enable: false.


이미 트레일러가 있는 커밋 정리

이미 Copilot 트레일러가 포함된 커밋을 비공개 저장소에 푸시한 경우, 이력 정리는 강제 재작성이 필요합니다. 이 작업은 본인이 유일한 기여자이고 커밋 SHA 변경의 결과를 이해하는 브랜치에서만 수행하세요.

# 최근 커밋을 편집하기 위한 대화형 rebase
git rebase -i HEAD~10

# 각 문제 커밋에 대해 'reword'로 표시한 후 트레일러 줄 제거
# 또는 대량 정리에 filter-branch 사용:
git filter-branch --msg-filter \
  'sed "/^Co-authored-by: GitHub Copilot/Id"' \
  HEAD~20..HEAD

재작성 후 강제 푸시가 필요합니다:

git push --force-with-lease origin your-branch
Warning --force-with-lease는 마지막 fetch 이후 다른 사람이 브랜치에 푸시했을 경우 거부하므로 --force보다 안전합니다. 공개 공유 브랜치는 보호하지 않으므로 개인 기능 브랜치 이외의 것에 대해서는 팀과 먼저 조율하세요.

이력을 재작성하고 싶지 않은 공개 GitHub 저장소에 이미 푸시된 경우, 현실적인 답은: 프로젝트의 CONTRIBUTING 파일에 상황을 문서화하고, 앞으로 hook을 추가하고, 이전 커밋은 그대로 받아들이는 것입니다. 활발한 공개 저장소의 이력 재작성은 해결하는 것보다 더 많은 문제를 만듭니다.

GitHub 저장소 설정에서 브랜치 보호 규칙 화면


빠른 체크리스트

상황에 따라 순서대로 진행하세요:

  1. 트레일러 확인: git log --format=full -5를 실행하고 커밋 본문 하단에 Co-authored-by: GitHub Copilot이 있는지 확인합니다.
  2. prepare-commit-msg hook 설치: 영향받는 저장소에 설치하세요 — 마찰이 가장 적고 신뢰성이 가장 높은 해결책입니다.
  3. VS Code Copilot 설정 확인: 설정을 열고 "copilot commit"을 검색한 후, 스파클 버튼을 사용하지 않는다면 커밋 메시지 생성을 비활성화합니다.
  4. 민감한 저장소의 경우: 해당 워크스페이스에서 Copilot을 비활성화하는 .vscode/settings.json을 추가하고 커밋하여 팀원들이 설정을 상속받도록 합니다.
  5. 팀 환경의 경우: .githooks/ 디렉토리를 생성하고, prepare-commit-msg 스크립트를 추가하고, 커밋한 후, 프로젝트의 설정 지침이나 Makefile에 git config core.hooksPath .githooks를 추가합니다.
  6. 전역 git 템플릿 설정: 여러 개인 저장소에서 작업하며 한 번에 설정하고 싶은 경우에 적용합니다.
  7. 공유 브랜치의 최근 커밋 감사: git log --grep="Co-authored-by: GitHub Copilot" --oneline을 사용하여 영향받은 커밋을 찾고 이력 정리가 필요한지 결정합니다.
  8. 수정 확인: 파일을 스테이징하고 VS Code에서 커밋 대화창을 열어 커밋을 확인하기 전에 트레일러가 없는지 확인합니다.

출처 및 추가 읽기

  • GitHub Docs — 커밋 트레일러 저작권 표시 — GitHub의 기여 그래프 내에서 공동 저자 트레일러가 어떻게 작동하는지, Co-authored-by 형식이 저장소 통계 및 풀 리퀘스트 저작권 표시에 어떤 의미를 갖는지에 대한 GitHub의 공식 문서입니다.

  • VS Code GitHub Copilot 확장 프로그램 변경 로그 (marketplace.visualstudio.com) — Copilot 확장 프로그램의 릴리스 노트에는 커밋 메시지 생성이 도입된 시기와 저작권 표시 동작에 대한 후속 변경 사항이 문서화되어 있습니다. 2023년 말 이후 버전을 검색하세요.

  • git-scm.com — githooks 문서prepare-commit-msg hook의 권위 있는 레퍼런스로, 다양한 git 클라이언트에서의 호출 컨텍스트, 인수, 커밋 프로세스와의 상호 작용 방식을 다룹니다.

  • Software Freedom Conservancy — 카피레프트와 AI 생성 코드 — AI 모델 출력이 GPL 및 AGPL 라이선스 의무와 어떻게 상호 작용하는지에 대한 SFC의 분석으로, 프로젝트에서 Copilot 저작권 표시를 처리하는 방법을 결정하는 오픈 소스 유지 관리자에게 관련이 있습니다.

  • GitHub 커뮤니티 포럼 — "내 입력 없이 Co-authored-by를 추가하는 Copilot" — 주입 동작의 실제 사례, 사용자 확인 해결 방법, 의도된 설계 대 보고된 엣지 케이스에 대한 GitHub 직원 응답을 문서화하는 지속적인 개발자 토론 스레드입니다.