질문자 :Brandon Fosdick
오늘 나는 프로젝트에 대한 로그를 살펴보고 얼마 전에 태그 이름을 뚱뚱한 것을 깨달았습니다. 태그 이름을 바꾸는 방법이 있습니까? Google은 유용한 정보를 찾지 못했습니다.
태그가 지정된 버전을 확인하고 새 태그를 만들 수 있다는 것을 알고 시도도 했습니다. 그러나 그것은 옳지 않은 태그 객체를 생성하는 것 같습니다. 하나를 위해,
git tag -l
다른 모든 태그와 관련하여 순서가 맞지 않게 나열합니다. 그게 중요한지는 모르겠지만, 새로운 태그 객체가 내가 원하는 것이 아니라는 생각이 들게 합니다. 태그 이름이 문서와 일치하는 것에만 관심이 있기 때문에 그렇게 할 수 있지만 올바른 방법이 있다고 가정하면 "올바른" 작업을 수행하고 싶습니다.
다음은 태그의 이름을 old
에서 new
바꾸는 방법입니다.
git tag new old git tag -d old git push origin new :old
push 명령의 콜론은 원격 저장소에서 태그를 제거합니다. 이 작업을 수행하지 않으면 끌어올 때 Git이 머신에 이전 태그를 생성합니다. 마지막으로 다른 사용자가 삭제된 태그를 제거했는지 확인합니다. 그들(동료)에게 다음 명령을 실행하도록 알려주십시오.
git pull --prune --tags
주석이 달린 태그를 변경하는 경우 새 태그 이름이 삭제하려는 주석이 달린 이전 태그 객체가 아니라 기본 커밋을 참조하는지 확인해야 합니다. 따라서, 사용 git tag -a new old^{}
대신 git tag new old
(경량 태그, 아니지만 주석 태그 객체이기 때문에 이것이 이 답변에 대한 추가 정보를 원하시면 ).
Casey Watson원래 질문은 태그 이름을 바꾸는 방법이었습니다. 먼저 OLD: git tag NEW OLD
의 별칭으로 NEW를 만든 다음 OLD: git tag -d OLD
를 삭제합니다.
"Git 방식" 및 (in)sanity에 관한 인용문은 태그 이름을 보존하지만 다른 저장소 상태를 참조하게 만드는 것에 대해 이야기하고 있기 때문에 기본이 아닙니다.
Greg McGary다른 답변 외에도 :
먼저 원래 커밋을 가리키는 이전 태그 이름의 별칭 을 만들어야 합니다.
git tag new old^{}
그런 다음 로컬 에서 이전 항목을 삭제해야 합니다.
git tag -d old
그런 다음 원격 위치에서 태그를 삭제합니다.
# Check your remote sources: git remote -v # The argument (3rd) is your remote location, # the one you can see with `git remote`. In this example: `origin` git push origin :refs/tags/old
마지막으로 원격 위치에 새 태그를 추가해야 합니다. 이 작업을 수행할 때까지 새 태그가 추가 되지 않습니다.
git push origin --tags
모든 원격 위치에 대해 이를 반복합니다.
Git 태그 변경이 패키지 소비자에게 미치는 영향에 유의하십시오!
kaiser이 위키 페이지 에는 여러 ref를 푸시할 수 있음을 상기시키는 흥미로운 한 줄짜리가 있습니다.
git push origin refs/tags/<old-tag>:refs/tags/<new-tag> :refs/tags/<old-tag> && git tag -d <old-tag>
다른 클론에게 git pull --prune --tags
따라서 아이디어는 다음을 푸시하는 것입니다.
-
<old-tag>
참조하는 모든 커밋에 대한 <new-tag>
: refs/tags/<old-tag>:refs/tags/<new-tag>
, -
<old-tag>
삭제 : :refs/tags/<old-tag>
예를 들어 " git 저장소 내에서 태그의 명명 규칙을 변경하시겠습니까? "를 참조하십시오.
VonC게시된 경우 삭제할 수 없습니다(타르 및 페더링 위험 없이). 'Git 방식'은 다음을 수행하는 것입니다.
제정신이군. 당신이 망친 것을 인정하고 다른 이름을 사용하십시오. 다른 사람들은 이미 하나의 태그 이름을 보았고 동일한 이름을 유지하면 두 사람 모두 "버전 X"를 가지고 있지만 실제로는 다른 "X"를 갖고 있는 상황에 처할 수 있습니다. 따라서 "X.1"이라고 부르고 끝냅니다.
또는,
미친 것. 다른 사람들이 이미 이전 버전을 보았더라도 새 버전을 "X"라고 부르고 싶을 것입니다. 따라서 이전 것을 아직 게시하지 않은 것처럼 git-tag -f를 다시 사용하십시오.
다음과 같은 이유로 너무 미쳤습니다.
Git은 사용자 뒤에 있는 태그를 변경하지 않습니다. 따라서 누군가가 이미 이전 태그를 가지고 있는 경우 트리에서 git-pull을 수행하면 이전 태그를 덮어쓰게 해서는 안 됩니다.
누군가로부터 릴리스 태그를 받은 경우 자신의 태그를 업데이트하여 해당 태그를 변경할 수 없습니다. 이것은 사람들이 자신의 태그 이름을 신뢰할 수 있어야 한다는 점에서 큰 보안 문제입니다. 정말 미친 짓을 하고 싶다면, 그냥 화를 내고 사람들에게 당신이 망쳤다고 말해야 합니다.
맨 페이지 의 모든 예의.
Robert Munteanu다른 답변에 대한 추가 기능으로 더 친숙한 *nix 이동 명령 느낌으로 한 번에 모든 작업을 수행할 수 있는 별칭을 추가했습니다. 인수 1은 이전 태그 이름이고 인수 2는 새 태그 이름입니다.
[alias] renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"
용법:
git renametag old new
Jared Knipp하나 또는 몇 개의 태그에 대해 3단계 접근 방식을 따르십시오.
1단계: 현재 태그가 가리키는 커밋의 커밋/객체 ID 식별
command: git rev-parse <tag name> example: git rev-parse v0.1.0-Demo example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde
2단계: 저장소에서 태그 삭제
command: git tag -d <tag name> example: git tag -d v0.1.0-Demo example output: Deleted tag 'v0.1.0-Demo' (was abcde)
3단계: 이전 태그가 가리키는 것과 동일한 커밋 ID를 가리키는 새 태그 만들기
command: git tag -a <tag name> -m "appropriate message" <commit id> example: git tag -a v0.1.0-full -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde example output: Nothing or basically <No error>
태그 이름 변경으로 로컬 git이 준비되면 이러한 변경 사항을 다른 사람들이 가져갈 수 있도록 원본으로 다시 푸시할 수 있습니다.
command: git push origin :<old tag name> <new tag name> example: git push origin :v0.1.0-Demo v0.1.0-full example output: <deleted & new tags>
vikas pachisia모험을 좋아하는 경우 하나의 명령으로 수행할 수 있습니다.
mv .git/refs/tags/OLD .git/refs/tags/NEW
wolfc이 답변은 기존 태그의 태그 정보를 사용하여 태거, 메시지 및 태그 날짜와 같은 모든 태그 정보를 포함하는 중복 주석 태그를 생성하여 문제를 해결합니다.
SOURCE_TAG=old NEW_TAG=new; deref() { git for-each-ref \ "refs/tags/$SOURCE_TAG" --format="%($1)" ; }; \ GIT_COMMITTER_NAME="$(deref taggername)" \ GIT_COMMITTER_EMAIL="$(deref taggeremail)" \ GIT_COMMITTER_DATE="$(deref taggerdate)" git tag "$NEW_TAG" \ "$(deref "*objectname")" -a -m "$(deref contents)" git tag -d old git push origin new :old
이전 및 새 태그 이름과 일치 SOURCE_TAG
및 NEW_TAG
값을 업데이트합니다.
동기 부여
내가 말할 수있는 바에 따르면 다른 모든 답변에는 미묘한 문제가 있거나 태그에 대한 모든 것을 완전히 복제하지 않습니다(예: 새 태그 날짜 또는 현재 사용자의 정보를 태그로 사용). 그들 중 다수는 이 시나리오에 적용되지 않음에도 불구하고 태그 재지정 경고를 호출합니다(다른 이름의 태그로 이름을 바꾸기 위한 것이 아니라 태그 이름을 다른 커밋으로 이동하기 위한 것입니다). 파헤쳐 본 결과 이러한 문제를 해결할 수 있는 솔루션을 구성했다고 생각합니다.
목표
git-tag
문서 는 주석이 달린 태그의 일부를 지정합니다. 진정으로 구별할 수 없는 이름이 되려면 이러한 요소가 새 태그에서 동일해야 합니다.
태그 객체( -a
, -s
또는 -u
)는 "주석이 있는" 태그라고 합니다. 여기에는 생성 날짜, 태거 이름과 이메일, 태깅 메시지, 선택적인 GnuPG 서명이 포함됩니다.
이 답변에서는 서명되지 않은 태그만 다루고 있지만 이 솔루션을 서명된 태그로 확장하는 것은 간단한 문제입니다.
절차
old
라는 주석이 달린 태그가 예제에서 사용되었으며 이름이 new
로 변경됩니다.
1단계: 기존 태그 정보 가져오기
먼저 기존 태그에 대한 정보를 가져와야 합니다. for-each-ref
사용하여 달성할 수 있습니다.
명령:
git for-each-ref refs/tags --format="\ Tag name: %(refname:short) Tag commit: %(objectname:short) Tagger date: %(taggerdate) Tagger name: %(taggername) Tagger email: %(taggeremail) Tagged commit: %(*objectname:short) Tag message: %(contents)"
산출:
Tag commit: 88a6169 Tagger date: Mon Dec 14 12:44:52 2020 -0600 Tagger name: John Doe Tagger email: <j.doe@example.com> Tagged commit: cda5b4d Tag name: old Tag message: Initial tag Body line 1. Body line 2. Body line 3.
2단계: 로컬에서 중복 태그 만들기
기존 태그에서 1단계에서 수집한 정보를 사용하여 새 이름의 중복 태그를 만들 수 있습니다.
커밋 ID 및 커밋 메시지는 git tag
직접 전달할 수 있습니다.
태거 정보(이름, 이메일, 날짜)는 git 환경 변수 GIT_COMMITTER_NAME
, GIT_COMMITTER_EMAIL
, GIT_COMMITTER_DATE
사용하여 설정할 수 있습니다. 이 컨텍스트에서 날짜 사용법은 git tag
에 대한 On Backdating Tags 문서에 설명되어 있습니다. 나머지 2개는 실험을 통해 알아냈습니다.
GIT_COMMITTER_NAME="John Doe" GIT_COMMITTER_EMAIL="j.doe@example.com" \ GIT_COMMITTER_DATE="Mon Dec 14 12:44:52 2020 -0600" git tag new cda5b4d -a -m "Initial tag Body line 1. Body line 2. Body line 3."
두 태그를 나란히 비교하면 중요한 모든 면에서 동일하다는 것을 알 수 있습니다. 여기서 다른 유일한 것은 태그 자체의 커밋 참조이며, 이는 두 개의 다른 태그이기 때문에 예상되는 것입니다.
명령:
git for-each-ref refs/tags --format="\ Tag commit: %(objectname:short) Tagger date: %(taggerdate) Tagger name: %(taggername) Tagger email: %(taggeremail) Tagged commit: %(*objectname:short) Tag name: %(refname:short) Tag message: %(contents)"
산출:
Tag commit: 580f817 Tagger date: Mon Dec 14 12:44:52 2020 -0600 Tagger name: John Doe Tagger email: <j.doe@example.com> Tagged commit: cda5b4d Tag name: new Tag message: Initial tag Body line 1. Body line 2. Body line 3. Tag commit: 30ddd25 Tagger date: Mon Dec 14 12:44:52 2020 -0600 Tagger name: John Doe Tagger email: <j.doe@example.com> Tagged commit: cda5b4d Tag name: old Tag message: Initial tag Body line 1. Body line 2. Body line 3.
현재 태그 데이터 검색을 포함하여 단일 명령으로:
SOURCE_TAG=old NEW_TAG=new; deref() { git for-each-ref "refs/tags/$SOURCE_TAG" --format="%($1)" ; }; GIT_COMMITTER_NAME="$(deref taggername)" GIT_COMMITTER_EMAIL="$(deref taggeremail)" GIT_COMMITTER_DATE="$(deref taggerdate)" git tag "$NEW_TAG" "$(deref "*objectname")" -a -m "$(deref contents)"
3단계: 로컬에서 기존 태그 삭제
다음으로 기존 태그를 로컬에서 삭제해야 합니다. 새 태그와 함께 이전 태그를 유지하려면 이 단계를 건너뛸 수 있습니다(예: 태그 이름을 바꾸지 않고 복제).
git tag -d old
4단계: 변경 사항을 원격 저장소로 푸시
git push
사용하여 변경 사항을 푸시할 수 있습니다.
git push origin new :old
이렇게 하면 new
태그가 old
태그가 삭제됩니다.
M. Justin태그 푸시 및 이미 푸시된 태그 이름 변경을 처리하는 문제에 관계없이 이름을 바꿀 태그가 주석 이 있는 태그인 경우 다음 한 줄 명령줄 덕분에 먼저 복사할 수 있습니다.
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
그런 다음 이전 태그를 삭제하기만 하면 됩니다.
git tag -d old_tag
다음 두 가지 답변 덕분에 이 명령줄을 찾았습니다.
편집하다:
fetch.pruneTags=true
설정의 자동 동기화를 사용하는 데 문제가 발생한 경우( https://stackoverflow.com/a/49215190/7009806 참조 ), 개인적으로 먼저 서버에 새 태그를 복사한 다음 이전 태그 를 삭제하는 것이 좋습니다. 하나. 이렇게 하면 기존 태그를 삭제할 때 새 태그가 무작위로 삭제되지 않으며 태그의 동기화는 아직 서버에 없는 새 태그를 삭제하려고 합니다. 예를 들어 모두 함께 다음을 얻습니다.
git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{} git push --tags git tag -d old_tag git push origin :refs/tags/old_tag
Oliviergit push
명령으로 이전 태그/분기를 새 이름으로 복제하고 이전 태그를 삭제하여 원격 태그를 체크아웃하지 않고 이름을 바꿀 수도 있습니다.
원격 태그 이름 바꾸기 / 원격 분기 → 태그 변환: (공지: :refs/tags/
)
git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>
원격 브랜치 이름 바꾸기 / 원격 태그 → 브랜치 변환: ( :refs/heads/
)
git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>
원격 태그 이름 바꾸기 출력:
D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23 Total 0 (delta 0), reused 0 (delta 0) To https://gitlab.server/project/repository.git - [deleted] App%2012.1%20v12.1.0.23 * [new tag] App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
zionyx출처 : http:www.stackoverflow.com/questions/1028649/how-do-you-rename-a-git-tag