Git 오류

Git의 “would clobber existing tag” 오류 해결 방법.

FluxGit ·

fetch가 기존 로컬 태그를 다른 객체로 바꾸려고 하면 Git은 “would clobber existing tag”를 표시합니다. 양쪽 태그 참조를 비교하고 원래 로컬 참조를 보존하세요. 원격 버전이 올바른 것으로 확인된 경우에만 그 태그 하나를 업데이트합니다.

안전한 처리 순서

오류에 표시된 태그를 찾으세요. 로컬과 원격의 객체 ID를 비교하고 로컬 백업을 만듭니다. 원격 버전이 올바른 경우에만 확인한 태그 하나를 강제로 fetch하세요. 모든 태그를 강제로 업데이트하거나 교체한 태그를 원격에 push하지 마세요.

주석 태그에는 자체 객체 ID가 있습니다. 같은 커밋을 가리키는 두 태그 객체도 메시지나 서명이 다를 수 있습니다. 무엇이 바뀌었는지 판단하기 전에 태그 참조와 태그를 역참조한 대상 객체를 함께 비교하세요.

1. 태그를 정확히 지정해 확인하기

v1.2.3을 오류에 표시된 태그로, origin을 대상 원격 이름으로 바꾸세요. 이 명령들은 참조를 변경하지 않습니다.

git show-ref --verify refs/tags/v1.2.3
git rev-parse 'refs/tags/v1.2.3^{}'
git ls-remote --tags origin 'refs/tags/v1.2.3' 'refs/tags/v1.2.3^{}'

첫 번째 명령은 로컬 태그 객체 ID를 표시합니다. 두 번째는 주석 태그를 역참조해 대상 객체를 찾습니다. 원격 출력에는 태그 참조가 나타나며, 주석 태그인 경우 역참조한 대상을 나타내는 ^{}로 끝나는 줄도 표시됩니다.

여기에 나온 전체 참조 이름을 사용하세요. v1.2.3 접두사 검색에는 v1.2.30도 포함될 수 있습니다. 원격에 해당 태그가 없다면 중단하세요. 이 절차를 이유로 로컬 태그를 삭제하지 마세요.

2. 원래 로컬 참조 보존하기

무언가를 교체하기 전에 복구용 로컬 태그를 만드세요. 마지막의 빈 인수는 백업 이름이 아직 사용되지 않아야 한다는 조건입니다.

git update-ref refs/tags/backup/v1.2.3 refs/tags/v1.2.3 ""
git rev-parse refs/tags/v1.2.3 refs/tags/backup/v1.2.3

두 객체 ID가 일치해야 합니다. 주석 태그의 메시지와 서명을 포함해 원래 태그 객체가 보존됩니다. 백업이 이미 있어 생성에 실패하면 다른 백업 이름을 고르고, 계속하기 전에 확인하세요.

차이가 해결될 때까지 백업을 유지하세요. 직접 push하지 않는 한 백업은 로컬에만 남습니다. 이 복구를 위해 git push --tags를 사용하지 마세요.

3. 확인한 태그 하나만 업데이트하기

원격 태그가 올바르고 백업이 존재하는지 확인한 후에만 실행하세요. 앞의 +는 이 특정 로컬 참조의 교체를 허용합니다.

git fetch --no-tags --no-prune --no-prune-tags origin '+refs/tags/v1.2.3:refs/tags/v1.2.3'
git show-ref --verify refs/tags/v1.2.3
git rev-parse 'refs/tags/v1.2.3^{}'

--no-tags는 다른 태그를 자동으로 따라 가져오는 기능을 끕니다. --no-prune과 --no-prune-tags는 이번 fetch에 설정된 참조 정리를 끄므로 복구 범위가 확대되지 않게 합니다. 원격의 브랜치나 태그를 push하거나 교체하는 작업이 아닙니다.

가져온 태그 객체와 역참조한 대상 객체를 앞서 확인한 원격 ID와 비교하세요. 복구 중 원격이 바뀌었다면 중단하고, 태그를 릴리스에 사용하기 전에 원인을 확인하세요. 백업은 여전히 원래 객체를 가리킵니다.

Git이 업데이트를 거부하는 이유

Git 2.20부터 fetch로 기존 refs/tags/* 참조를 교체하려면 강제 업데이트를 명시해야 합니다. 두 대상 커밋이 조상 관계에 있더라도 이 규칙은 적용됩니다. 태그 업데이트에는 브랜치의 fast-forward 규칙을 사용하지 않습니다.

로컬 태그가 올바른 릴리스를 가리킨다면 그대로 두고 유지 관리자와 조율하세요. 공개된 원격 태그를 교체하면 다른 사용자가 같은 버전 이름으로 받는 내용이 달라집니다.

Git 공식 참고 자료

저장소 상태를 파악하세요

먼저 확인하고, 필요한 참조만 바꾸세요.

FluxGit은 macOS, Windows, Linux용 데스크톱 Git 클라이언트에서 태그, 저장소 상태 점검, 확인 절차가 있는 작업을 함께 제공합니다. 참조를 변경하기 전에 위 명령으로 이 Git 오류를 진단하세요.

관련 자료(영어)