programing

Git 태그를 재생성한 후 "태그가 원격에 이미 있습니다" 오류가 발생했습니다.

yoursource 2023. 9. 4. 22:49
반응형

Git 태그를 재생성한 후 "태그가 원격에 이미 있습니다" 오류가 발생했습니다.

아래 단계를 실행한 후 다음 오류가 발생합니다.

To git@provider.com:username/repo-name.git
 ! [rejected]        dev -> dev (already exists)
error: failed to push some refs to 'git@provider.com:username/repo-name.git'
hint: Updates were rejected because the tag already exists in the remote.
  1. 리포지토리를 만들었습니다.
  2. 로컬 컴퓨터에서 레포를 복제했습니다.
  3. README 파일을 수정하고 변경 사항을 커밋한 후 커밋을 푸시했습니다.
  4. 된 태그 태된그dev:git tag dev
  5. 태그: 푸된태그:git push --tags
  6. README 파일을 수정하고 변경 사항을 커밋한 후 커밋을 푸시했습니다.
  7. 된 태그 제된태그dev다시 생성하고 태그를 푸시했습니다.

    git tag -d dev
    git tag dev
    git push --tags
    

왜 이런 일이 생기는 건가요?

저는 맥에 있어요.리눅스(우분투)를 사용하는 내 친구들은 이 문제가 없습니다.나는 내가 사용할 수 있다는 것을 알고 있습니다.git push --tags -f태그를 강제로 업데이트하지만 이는 위험합니다(예: 분기가 아닌 태그에서만 실수로 커밋을 다시 작성).

편집, 2016년 11월 24일: 이 답변은 분명히 인기가 있어서 여기에 메모를 추가합니다.중앙 서버에서 태그를 교체하는 경우, 이전 태그(이미 태그가 있는 중앙 서버 리포지토리의 복제본)를 가진 모든 사용자가 이전 태그를 유지할 수 있습니다.그래서 이것이 어떻게 하는지 알려주는 동안, 여러분이 그것을 하고 싶어하는지 확실히 하세요.이미 "잘못된" 태그를 가진 모든 사용자가 "잘못된" 태그를 삭제하고 새 "올바른" 태그로 바꾸도록 해야 합니다.

2한 결과 Git 2.10/2.11을 실행하는 태그 을 알 수 .git fetch는 " " " 를 실행하는 입니다.git fetch --tags.

(원답은 다음과 같습니다.)


태를누르고하면라그,,하면▁when▁to▁you▁tags고.git push --tags( 및 및 설정의 ) .new-sha1 refs/tags/name(태그별로 하나씩 전송됩니다.)

업데이트 요청은 리모컨에 의해 수정되어 각 태그에 대해 하나씩 추가된 다음 사전 수신 후크 및/또는 업데이트 후크(원격에 있는 후크 중 하나)로 전달됩니다.이러한 후크는 태그 생성/삭제/업데이트를 허용할지 또는 거부할지 결정할 수 있습니다.

태그가 생성되는 경우 값은 0이 모두 "null"인 SHA-1입니다.태그가 삭제되는 경우 은 null SHA-1입니다.그렇지 않으면 두 SHA-1 값이 모두 실제 유효한 값입니다.

후크가 없는 경우에도 실행되는 일종의 "내장 후크"가 있습니다. 리모컨은 "강제" 플래그를 사용하지 않는 한 태그 이동을 거부합니다("추가" 및 "삭제" 모두 "내장 후크"는 항상 정상임에도 불구하고).현재 보고 있는 거부 메시지는 이 기본 제공 후크에서 온 것입니다. (참고로 이 기본 제공 후크는 빠르게 전달되지 않는 지점 업데이트도 거부합니다.)1

하지만, 여기에 무슨 일이 일어나고 있는지 이해할 수 있는 열쇠가 있습니다.git push, 값이 못합니다. step은 SHA-1의 값을 가지고 있습니다.여기에는 "SHA-1 값과 함께 전체 태그 목록이 있습니다."라고만 표시됩니다.원격은 값을 비교하고 추가 및/또는 변경 사항이 있는 경우 해당 값에 대한 후크를 실행합니다. (같은 태그의 경우에는 전혀 작동하지 않습니다.)태그가 없는 경우에는 아무 것도 하지 않습니다!)

태그를 로컬로 삭제하는 경우push당신의 푸시는 단순히 태그를 전송하지 않습니다.리모컨은 변경해서는 안 된다고 가정합니다.

태그를 로컬에서 삭제한 후 새 위치를 가리키며 태그를 작성할 경우push밀어넣기는 태그를 전송하고 리모컨은 이를 태그 변경으로 보고 강제 변경이 아닌 한 변경을 거부합니다.

따라서 두 가지 옵션이 있습니다.

  • 강제 추행을 하거나, 아니면.
  • 원격에서 태그를 삭제합니다.

후자는 다음을 통해 가능합니다.git push2 로컬에서 태그를 삭제하고pushing ing 효없습니다가과은다니습▁ing없효.을 리컨의이다같음가다이니정합과름을모로 합니다.origin는 삭할태그다같과습다니음는제▁you다입니다.dev:

git push origin :refs/tags/dev

원격에서 태그를 삭제하도록 요청합니다.dev. 의 당신지저서무는니다관합에종; 류의이런역소장의▁in의종류.push,와 함께:remoteref는push.refspec, 이며, 는 refspec입니다.

추가된 후크에 따라 원격에서 태그 삭제를 허용하거나 허용하지 않을 수 있습니다. 두 태그는 사라집니다.git push --tags의 지인이있때을현▁a▁you때을▁when▁local▁havedev이 달린 태그 개체를 , 새 repo를 합니다.dev에 태그. 에콘리.dev이제 새로 생성된 태그가 되므로 리모컨에서 푸시를 허용할 수 있습니다(이것도 추가된 추가 후크에 따라 다릅니다).

힘으로 누르는 것이 더 간단합니다.태그 이외의 다른 업데이트를 하지 않으려면 다음과 같이 하십시오.git pushrefspec 하나만 누르면 됩니다.

git push --force origin refs/tags/dev:refs/tags/dev

--tags하나의 태그 ref-spec만 명시적으로 푸시하는 경우).


1물론 이 기본 제공 후크의 이유는 동일한 원격 레포의 다른 사용자가 기대하는 동작, 즉 분기가 다시 감기지 않고 태그가 움직이지 않는 동작을 수행하는 데 도움이 되기 때문입니다.강제로 누르면 다른 사용자에게 이 작업을 수행 중임을 알려 수정할 수 있습니다.Git 1.8.2는 "태그가 전혀 움직이지 않음"을 새로 적용했습니다. 이전 버전에서는 분기 이름과 마찬가지로 커밋 그래프에서 태그가 "앞으로 이동"할 수 있습니다.Git 1.8.2 릴리스 정보를 참조하십시오.

2원격으로 로그인할 수 있다면 사소한 일입니다.Git 저장소로 이동하여 실행하기만 하면 됩니다.git tag -d dev원격에서 태그를 삭제하거나 사용하는 방법 중 하나를 참조하십시오.git push삭제하기 위해—리모트에 액세스하는 사람은 누구나 발견할 수 있는 기간이 있습니다.dev태그가 없습니다. (이미 태그가 있는 경우 이전 태그를 계속 가지고 있으며 새 태그를 누르기 전에 이전 태그를 다시 밀어 올릴 수도 있습니다.)

Mac 소스 트리에서만 Push all tags 확인란의 선택을 취소합니다.

enter image description here

소스 트리를 사용하는 경우 매우 간단합니다.

enter image description here 기본적으로 충돌하는 태그를 제거했다가 다시 추가하면 됩니다.

  1. 리포지토리 -> 태그 -> 태그 제거로 이동합니다.
  2. 충돌하는 태그 이름 선택
  3. 모든 원격에서 태그 제거를 선택합니다.
  4. 제거를 누릅니다.
  5. 적절한 커밋에 동일한 이름의 새 태그 만들기
  6. 원격으로 변경사항을 푸시할 때 모든 태그 밀어넣기를 선택해야 합니다.

제가 이 문제에 대해 늦은 것 같기도 하고 이미 답변이 된 것 같기도 하지만, 할 수 있는 일은 다음과 같습니다. (저의 경우, 저는 현지에서 태그를 하나만 가지고 있었기 때문에..이전 태그를 삭제하고 다음과 같이 다시 태그를 지정했습니다.

git tag -d v1.0
git tag -a v1.0 -m "My commit message"

그러면:

git push --tags -f

원격의 모든 태그가 업데이트됩니다.

위험할 수 있습니다!자신의 위험을 무릅쓰고 사용합니다.

태그를 업데이트하려면 다음과 같이 하십시오.1.0.0

  1. git checkout 1.0.0
  2. 변경합니다.
  3. git ci -am 'modify some content'
  4. git tag -f 1.0.0
  5. 에서 원격 태그 삭제:git push origin --delete 1.0.0
  6. git push origin 1.0.0

다 했어요.

거부되는 이유는 태그가 원격 버전과 동기화되지 않았기 때문입니다.이것은 분기와 동일한 동작입니다.

를 통해동태기화그를 와 동기화git pull --rebase <repo_url> +refs/tags/<TAG>동기화한 후에는 충돌을 관리해야 합니다.diftool을 설치한 경우(예: meld)git mergetool meld원격 동기화 및 변경 사항 유지에 사용합니다.

--rebase 플래그를 사용하는 이유는 원격 플래그 위에 작업을 올려놓아 다른 충돌을 방지하기 위해서입니다.

또한, 이해가 안 되는 것은 왜 당신이 그것을 삭제하느냐는 것입니다.dev태그를 지정하고 다시 생성하시겠습니까?태그는 소프트웨어 버전 또는 마일스톤을 지정하는 데 사용됩니다. 태그의 예 깃 태 예v0.1dev,v0.0.1alpha,v2.3-cr(cr - 후보 릴리스) 등.


이 문제를 해결할 수 있는 또 다른 방법은 문제입니다.git reflog그리고 당신이 밀어붙인 그 순간으로 가세요.dev리모콘에 태그커밋 ID를 복사합니다.git reset --mixed <commmit_id_from_reflog>이렇게 하면 태그를 눌렀을 때 태그가 리모컨과 동기화되어 충돌이 발생하지 않습니다.

어떻게 이런 상태가 됐는지 아직도 궁금할 때...

로컬 중복 태그를 모두 삭제한 다음 원격에서 해당 태그를 제거하는 간단한 해결책을 찾았습니다.예:

git tag -d some-tag
git pull --tags

더 이상 충돌이나 경고가 없습니다.

로컬 리포지토리를 미리 백업하는 것이 좋습니다.

윈도우즈 소스 트리에서 선택 취소Push all tags to remotes.

enter image description here

여기 좋은 대답이 있습니다.특히 @torek의 작품.급하게 서두르는 사람들을 위해 약간의 설명과 함께 이 해결책을 추가해야겠다고 생각했습니다.

요약하면 태그를 로컬로 이동하면 Null이 아닌 커밋 값에서 다른 값으로 태그가 변경됩니다.그러나 Git(기본 동작)에서는 Null이 아닌 원격 태그를 변경할 수 없으므로 변경 내용을 푸시할 수 없습니다.

해결 방법은 태그를 삭제하고 체크 표시를 하여 모든 원격을 제거하는 것입니다.그런 다음 동일한 태그를 만들고 푸시합니다.

언급URL : https://stackoverflow.com/questions/19298600/tag-already-exists-in-the-remote-error-after-recreating-the-git-tag

반응형