Git 태그의 이름을 어떻게 바꾸나요?


1219

오늘 나는 프로젝트의 로그를 살펴보면서 얼마 전에 태그 이름을 지목했다는 것을 깨달았습니다. 태그 이름을 바꾸는 방법이 있습니까? Google은 유용한 정보를 찾지 못했습니다.

태그가 달린 버전을 확인하고 새 태그를 만들 수 있다는 것을 알고 있습니다. 그러나 그것은 옳지 않은 태그 객체를 만드는 것 같습니다. 하나는

git tag -l

다른 모든 태그와 관련하여 순서가 맞지 않습니다. 그것이 중요한지 모르겠지만 새 태그 객체가 내가 원하는 것이 아니라고 믿게 만듭니다. 태그 이름이 문서와 일치하는 것만 신경 쓰기 때문에 그와 함께 살 수 있지만, 올바른 방법이 있다고 가정하면 "올바르게"할 것입니다.


이전 태그에 주석이 달린 / ​​서명 된 태그 인 경우 같은 호출을 사용 했습니까? 새 태그도 이런 종류입니까, 아니면 가벼운 태그입니까?
Jakub Narębski

1
잘못된 이전 태그와 원하는 새 태그 모두에 주석을 달고 서명하지 않아야합니다. 이전 태그는 'git tag -a bad_tag_name'으로 작성되었으므로 'git tag -a good_tag_name'행을 따라 무언가를 수행하고 싶습니다.
Brandon Fosdick 2016 년

이 마법 태그 이름 바꾸기 프로세스가 이름이 바뀌는 태그의 주석을 유지하기를 원한다는 점을 지적해야합니다. 사실, 저는 이름 만 바꾸고 싶습니다.
Brandon Fosdick 2016 년

7
git log --oneline --decorate --graph태그를 정리할 때 도움이됩니다.
Joel Purra

한 줄로 태그 이름을 바꿀 수 있습니다. 아래 답변을
VonC

답변:


2038

저는 여기에 태그 이름을 변경하는 방법입니다 old로를 new:

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

push 명령의 콜론은 원격 저장소에서 태그를 제거합니다. 이 작업을 수행하지 않으면 Git은 컴퓨터를 당기면 기존 태그를 생성합니다.

마지막으로 다른 사용자가 삭제 된 태그를 제거해야합니다. 다음 명령을 실행하도록 동료 (동료)에게 알려주십시오.

git pull --prune --tags

참고 이 주석 태그를 변경하는 경우 , 새 태그 이름이 커밋 및 삭제에 대한 걸하지 오래된 주석 태그 객체 기본 참조되어 있는지 확인 필요. 따라서 git tag -a new old^{}대신 git tag new old주석을 사용하십시오 (주석 태그는 객체이지만 경량 태그는 그렇지 않기 때문에이 답변에 더 많은 정보가 있음 ).


19
태그에 주석이 달린 경우 새 태그에 이전 태그의 메시지가 표시되지 않지만 유용한 정보입니다.
NickSoft

25
@ NickSoft, 방금 주석이 달린 태그로 위의 작업을 수행했습니다. 메시지는 오래된 것에서 새로운 것으로 잘 복사되었습니다. 어쩌면 최신 버전의 git이 있습니까?
katyhuff

25
git push origin :refs/tags/oldgit push origin :old내가 생각 하기에 단순화 될 수 있습니다 .
Jesse Glick

25
"git push --tags"를이 태그 "git push origin refs / tags / new"에보다 명확하게 변경하는 것이 좋습니다. 실수로 다른 태그를 푸시하고 싶지 않습니다.
chrish

11
경고 :를 사용 git tag new old하면 이전 태그의 커밋이 아닌 이전 태그를 가리키는 태그가 생성됩니다 . ( Git GUI에서 태그를 체크 아웃 할 수없는 이유는 무엇입니까? )
Stevoisiak

297

원래 질문은 태그 이름을 바꾸는 방법이었습니다. 먼저 OLD의 별칭으로 NEW를 git tag NEW OLD만든 다음 OLD : 를 삭제하십시오 git tag -d OLD.

태그 이름을 유지하는 것에 대해 이야기하고 있지만 다른 저장소 상태를 참조하기 때문에 "Git way"및 (in) sanity에 대한 인용문은 기본이 아닙니다.


3
위의 답변은 git push origin비즈니스를 포함하므로 약간 바람직합니다 .
Roly

가장 쉬운 방법은, 작업 위대한는 Gitflow로 만든 이전 릴리스 태그 이름을 바꾸려면
RousseauAlexandre

5
경고 :를 사용 git tag new old하면 이전 태그의 커밋이 아닌 이전 태그를 가리키는 태그가 생성됩니다 . ( Git GUI에서 태그를 체크 아웃 할 수없는 이유는 무엇입니까? )
Stevoisiak

118

다른 답변 외에도 :

먼저 원래 커밋을 가리키는 이전 태그 이름 의 별칭 을 만들어야합니다.

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 tag new old하면 이전 태그의 커밋이 아닌 이전 태그를 가리키는 태그가 생성됩니다 . ( Git GUI에서 태그를 체크 아웃 할 수없는 이유는 무엇입니까? )
Stevoisiak

1
@StevenVascellaro 링크 감사합니다. 다음 번에는 수정 사항을 제출하십시오. 답변은 커뮤니티 노력입니다. 감사.
kaiser

아직 코드를 직접 테스트하지 않았기 때문에 편집하지 않았습니다. (연관된 질문에 대한 제출 날짜 참고)
Stevoisiak

일단하게되면 git tag new old^{}, 우리는 필요하지 않다 git tag new_tag_name old_tag_name(첫 단계).
Number945

28

게시 된 경우 삭제할 수 없습니다 (예 : 타르 및 페더 링 위험). 'Git way'는 다음을 수행하는 것입니다.

제정신 망했음을 인정하고 다른 이름을 사용하십시오. 다른 사람들은 이미 하나의 태그 이름을 보았고 같은 이름을 유지하면 두 사람이 모두 "버전 X"를 가지고 있지만 실제로는 "X"가 다른 상황에있을 수 있습니다. "X.1"이라고 부르고 완료하십시오.

또는

미친 것. 다른 사람들이 이미 이전 버전을 보았지만 새 버전 "X"도 호출하려고합니다. 따라서 이전 것을 아직 게시하지 않은 것처럼 git-tag -f를 다시 사용하십시오.

다음과 같은 이유로 너무 미쳤습니다.

Git은 사용자 뒤의 태그를 변경하지 않아야합니다. 누군가가 이미 오래된 태그를 가지고 있다면 트리에서 git-pull을 수행하면 이전 태그를 덮어 쓰지 않아야합니다.

누군가 릴리스 태그를받은 경우 자신의 태그를 업데이트하여 태그를 변경할 수는 없습니다. 사람들이 태그 이름을 신뢰할 수 있어야한다는 점에서 이는 큰 보안 문제입니다. 당신이 정말로 미쳤던 일을하고 싶다면, 당신은 그것의 문제를 해결하고 사람들에게 당신이 엉망이라고 말하면됩니다.

매뉴얼 페이지 의 모든 예의 .


6
또는 이름이 잘못 지정된이 태그에 올바른 이름으로 태그를 지정할 수 있습니다.
Jakub Narębski

6
고마워, 나는 그 맨 페이지를 이미 백만 번 넘겼습니다. 다행히 나쁜 태그는 어디에도 게시되지 않았습니다. 그것이 되었더라도 이것은 내부 프로젝트이며 나는 유일한 개발자입니다 (현재). 나는 tarring과 feathering 모두에서 상당히 안전하다고 생각하지만, repo가 ​​문서와 일치하도록 할 수있는 경우에만.
Brandon Fosdick 2016 년

나는 때때로 내 자신의 개인 참조에 태그를 사용합니다. 예 : 'ok_jb'태그 일 수 있습니다. 나는 함께 일하는 사람들 중 일부가 내 플랫폼을 빌드 할 수 없으므로 때로는 빌드 오류가 발생하기 때문에 이것을 사용합니다. 그런 다음 해당 태그를 확인하여 빌드 버전을 빠르게 얻을 수 있습니다. 새 소스가 빌드되면 태그를 이동하거나 builds ##으로 이름을 바꿉니다. 여기서 ##은 숫자입니다 (프로젝트에 따라 다름). 태그를 추가하여 특수 기능이 도입 된시기를 강조 할 수도 있습니다.

7
불쌍한 대답. "하지 마십시오"는 "어떻게 할 수 있습니까?"에 대한 정답은 아닙니다. 사용자가 그렇게하는 것이 좋은 생각인지 사람들이 좋아할 것인지 묻지 않았습니다. 누군가 "내 손을 어떻게자를 수 있습니까?"라고 물으면 그 방법을 알려주거나 혼자 내버려 두지 만 손을 자르는 것이 그렇게 좋은 아이디어는 아니라고 말하는 사람은 필요하지 않습니다. 그리고 당신은 할 수 있습니다. 새 태그를 추가하고 이전 태그를 삭제할 수 있으며 원격 저장소에서도 기술적으로 가능합니다.
Mecki

5
이것은 "기존 태그가 다른 개정을 가리 키도록하려면 어떻게해야합니까?"라는 질문에 대답하는 것 같습니다. OP의 질문 대신 "태그 이름을 어떻게 바꾸나요?" 또한 일반적으로 좋은 아이디어 임에도 불구하고 사람들에게 엉망으로 알리는 것이 문제를 어떻게 해결할지 불분명합니다.
LarsH

25

이 위키 페이지는 우리가 밀어 수 있다는 것을 우리에게 상기시켜 흥미로운 한 줄,이 몇 가지 심판을 :

git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>

다른 복제 자에게 git pull --prune --tags

따라서 아이디어는 다음을 추진하는 것입니다.

  • <new-tag>에서 참조하는 모든 커밋에 대한 <old-tag> <refs/tags/old-tag>:<refs/tags/new-tag>,
  • 삭제<old-tag> ::<refs/tags/old-tag>

" git 저장소 내에서 태그의 이름 지정 규칙을 변경 하시겠습니까? " 의 예를 참조하십시오 .


주석이 보존됩니까?
Brandon Fosdick

1
주석이 달린 태그의 주석에 원래 태그 이름남습니다 . 적어도 현재 버전에서는 실제로 그것이 무엇을 의미하는지 확실하지 않습니다.
gbr

@gbr 주석에 "원래 태그 이름"이 남은 것을 보여주는 예제로 답변을 편집 할 수 있습니까?
VonC

1
@VonC 나는 당신이 무엇을 요구하는지 이해하지 못한다; 어쩌면 나는 명확하지 않았습니다 : 주석 객체에는 태그 이름으로 설정된 태그 필드가 포함되어 있습니다 git cat-file -p <tag>. 내 시스템에서 귀하의 방법을 사용하면 '이름이 바뀐'태그 ref ( <new-tag>)가 표시되지만 태그 필드는 여전히 <old-tag>입니다.
gbr

3
@gbr OP가 원하는 것이 아닌가? 그는 "이 마법의 태그 이름 바꾸기 프로세스가 이름이 바뀌는 태그의 주석을 유지하기를 원한다는 점을 지적해야한다. 실제로는 이름 만 바꾸고 싶습니다."( stackoverflow.com/questions/1028649/ how-do-you-re-a-git-tag /… )
VonC

25

다른 답변에 대한 추가로, 나는 익숙한 * 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

!sh(Windows Git에 관한 질문) 실패 했지만 형식을 다음과 같이 업데이트 한 후에는 효과가 없었습니다 renametag = "!f() { git tag $2 $1; git tag -d $1; git push origin :refs/tags/$1; git push --tags; }; f".
서니 파텔

10

하나 또는 몇 개의 태그에 대해 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 push origin :refs/tags/v0.1.0-Demo를 푸시 백하고 태그를 푸시 백하는 단계가 누락되었습니다 (기타 보류중인 것 포함)git push --tags
Star Wolf

6

모험을 위해 하나의 명령으로 수행 할 수 있습니다.

mv .git/refs/tags/OLD .git/refs/tags/NEW

7
당신의 심판을 포장하는 경우 사용자가 실행 한 경우에, 즉 작동하지 않습니다 git gc최근
forivall

2
이것은 또한 로컬 리포지토리에만 영향을 미칩니다. 리모컨을 구성한 경우 이것이 어떤 부정적인 영향을 줄 수 있는지 잘 모르겠습니다. 이 방법은 권장하지 않습니다.
therealklanni

1
주석이 달린 태그의 경우 다른 것들 중 '주석'블롭에 태그의 원래 이름이 포함되어 있기 때문에 아마도 더 번거로울 것입니다. 실제로 그것이 (적어도 검증 태그에 의해) 어떤 것이 사용되는지 확실하지 않지만, 나는 기회를 얻지 않을 것입니다.
gbr

1
@gbr 이것은 잘 작동합니다. (물론 @forivall의 메모를 고려해야합니다.)이 트릭은 ALT Sisyphus 빌드 시스템에서 오랫동안 사용되었습니다. 패키지의 소스가 어떻게 저장되는지보십시오 (예 : git.altlinux.org/gears/g/gear.git) . 2.0.7-alt1 과 같이 읽을 수있는 태그 는 관리자가 빌드 시스템에 제출 한 서명 된 태그입니다. 암호화 시스템 gb-sisyphus-task164472.200 은이 소스에서 pkg을 빌드 및 게시 한 작업 ID를 추적하기 위해 빌드 시스템에 의해 배치됩니다. 이들은 cp관리자의 메시지를 건드리지 않은 멍청한 사본 ( )입니다.
imz-Ivan Zakharyaschev

@ imz--IvanZakharyaschev 알아두면 좋겠지 만, 앞으로 어떤 제품에서는 문제를 일으키지 않을 것이지만 너무 신뢰하지는 않을 것입니다. 망할 놈의 저장소 형식 및 예상 상호 작용의 실제 사양은 내가 가장 놀라운 방법으로 깨끗하게 일을하기 위해 노력 것이 실용적이다 그래서 때, 없다
GBR

3

태그 푸시 및 이미 푸시 된 태그 이름 바꾸기와 관련된 문제에 관계없이 이름을 바꿀 태그에 주석이 달린 태그가있는 경우 다음 단일 행 명령 줄을 사용하여 먼저 복사 할 수 있습니다.

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

그런 다음 이전 태그를 삭제하면됩니다.

git tag -d old_tag

다음 두 가지 답변 덕분 에이 명령 줄을 찾았습니다.

편집 : https://stackoverflow.com/a/49215190/7009806에 설명 된대로
태그 자동 동기화 설정에 문제가 발생하면 개인적으로 먼저 서버에서 새 태그를 복사 한 다음 이전 태그 삭제하는 것이 좋습니다 . 이렇게하면 이전 태그를 삭제할 때 새 태그가 임의로 삭제되지 않으며 태그 동기화를 통해 아직 서버에없는 새 태그를 삭제하려고 합니다 . 예를 들어, 우리 모두는 다음을 얻습니다.fetch.pruneTags=true

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

3

이전 태그 / 분기를 새 이름으로 복제하고 이전 git 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.