편집, 2016 년 11 월 24 일 :이 답변은 분명히 인기가 있으므로 여기에 메모를 추가하고 있습니다. 중앙 서버에서 태그 를 교체 하면 이전 태그 (태그가 이미있는 중앙 서버 저장소의 복제본)를 가진 사람은 기존 태그를 유지할 수 있습니다. 따라서 이것이 수행 방법을 알려주는 동안 실제로 하고 싶습니다 . 이미 "잘못된"태그가있는 모든 사람이 "잘못된 태그" 를 삭제 하고 새 "올바른 태그"로 교체해야합니다.
Git 2.10 / 2.11에서 테스트 한 결과 이전 태그를 유지하는 것이 실행중인 클라이언트의 기본 동작 git fetch
이며 업데이트는 실행중인 클라이언트의 기본 동작입니다 git fetch --tags
.
(원래 답변은 다음과 같습니다.)
태그 푸시를 요청하면 git push --tags
(커밋 및 필요한 기타 객체 및 푸시 설정의 다른 참조 업데이트와 함께) 형식의 업데이트 요청을 원격으로 보냅니다 . (그러나 각 태그마다 하나를 많이 보냅니다.)new-sha1 refs/tags/name
업데이트 요청은 원격에 의해 수정되어 old-sha1
(또는 태그마다 하나씩) 수신 된 후 및 / 또는 업데이트 훅 (원격에있는 후크)에 전달됩니다. 이러한 후크는 태그 생성 / 삭제 / 업데이트 허용 여부를 결정할 수 있습니다.
old-sha1
값은 모두 제로 "NULL"SHA-1, 태그가 생성되는 경우이다. 그만큼new-sha1
태그가 삭제되는 경우 널 SHA-1입니다. 그렇지 않으면 두 SHA-1 값이 모두 유효하고 유효한 값입니다.
후크가없는 경우에도 일종의 "내장 후크"가 실행됩니다. "force"플래그를 사용하지 않으면 리모콘이 태그 이동을 거부합니다 ( "내장 후크"는 항상 두 가지 모두 OK 임) "추가"및 "삭제"). 보고있는 거부 메시지는이 내장 후크에서 나옵니다. (실제로이 내장 후크는 빨리 감기되지 않는 분기 업데이트도 거부합니다.) 1
그러나 여기에 무슨 일이 일어나고 있는지 이해하는 열쇠가 있습니다. git push
는 리모컨에 현재 해당 태그가 있는지 여부와 그에 따른 SHA-1 값이 무엇인지 알 수 없습니다. "내 SHA-1 값과 함께 전체 태그 목록이 있습니다"라고만 표시됩니다. 리모콘은 값을 비교하고 추가 및 / 또는 변경이있는 경우 해당 값에 대한 후크를 실행합니다. (같은 태그의 경우에는 아무 것도 수행하지 않습니다. 태그가없는 태그의 경우 아무 것도 수행하지 않습니다!)
태그를 로컬에서 삭제하면 push
푸시만으로 태그가 전송되지 않습니다. 리모콘은 변경하지 않아야한다고 가정합니다.
로컬에서 태그를 삭제 한 다음 새 위치를 가리키는 태그를 생성하면을 push
누르면 푸시가 태그를 전송하고 원격에서이 태그를 태그 변경으로 인식하고 강제 푸시가 아닌 한 변경을 거부합니다.
따라서 두 가지 옵션이 있습니다.
- 강제 푸시를 수행하거나
- 리모컨에서 태그를 삭제하십시오.
후자 는 태그를 로컬로 삭제하고 ing이 효과가 없지만 git push
2 를 통해 가능 push
합니다. 리모컨의 이름이 origin
이고 삭제하려는 태그가 다음과 같다고 가정합니다 dev
.
git push origin :refs/tags/dev
이것은 리모콘이 태그를 삭제하도록 요청합니다. dev
로컬 저장소에 태그 가 있는지 여부 는 관련이 없습니다. 이런 종류의 push
와 함께, refspec로, 순수 삭제 푸시입니다.:remoteref
리모컨은 추가 된 후크에 따라 태그 삭제를 허용하거나 허용하지 않을 수 있습니다. 삭제를 허용하면 태그가 사라지고 두 번째 git push --tags
는 dev
커밋 또는 주석이 달린 태그 저장소 객체를 가리키는 로컬 태그가 있으면 새 dev
태그를 보냅니다 . dev
이제 원격에서 새로 생성 된 태그가 될 것이므로 원격에서 푸시를 허용 할 것입니다 (다시 추가 된 후크에 따라 다름).
강제 푸시가 더 간단합니다. 당신이 업데이트 아무것도 확실하지 수 있도록하려면 다른 태그보다 단지 이야기 git push
만 하나 refspec를 밀어 :
git push --force origin refs/tags/dev:refs/tags/dev
(참고 : --tags
하나의 태그 참조 스펙 만 명시 적으로 푸시하는 경우 필요하지 않습니다 ).
1 물론, 이유는 이 내장 된 후크 도움이되는 행동을 강제하기위한 그 다른 사용자가 동일한 원격 REPO 기대 : 가지 되감기하지 않고, 태그가 움직이지 않는다. 강제 푸시하는 경우 다른 사용자에게이 작업을 수행하고 있음을 알리면 문제를 해결할 수 있습니다. "태그가 전혀 움직이지 않습니다"는 Git 1.8.2에 의해 새롭게 시행됩니다. 이전 버전에서는 태그가 커밋 그래프에서 분기 이름과 매우 유사하게 "앞으로 이동"할 수있었습니다. git 1.8.2 릴리즈 노트를 참조하십시오 .
2 원격으로 로그인 할 수 있다면 쉽지 않습니다. Git 저장소로 이동하여 실행하십시오 git tag -d dev
. 리모컨에있는 태그를 삭제하거나 삭제하는 데 사용하는 방법 중 하나는 리모컨에 git push
액세스하는 사람이 dev
태그가 누락 된 것을 발견 할 수 있습니다. (그들은이 계속 자신의 그들은 이미있는 경우, 기존 태그를, 그들은 심지어 밀어 수있는 자신의 새 일을 추진하기 전에 기존 태그 백업을.)