programing

Git 태그의 이름을 바꾸려면 어떻게 해야 하나요?

javajsp 2023. 4. 19. 22:14

Git 태그의 이름을 바꾸려면 어떻게 해야 하나요?

오늘 나는 프로젝트를 위해 로그를 뒤적거리다가 얼마 전에 태그네임을 알아챘다.태그 이름을 바꿀 수 있는 방법이 있나요?구글은 쓸만한 것을 찾지 못했다.

태그된 버전을 확인하고 새로운 태그를 만들 수 있다는 것을 깨달았습니다.그것도 시도해 보았습니다.그러나 이 경우 태그 객체가 제대로 생성되지 않는 것으로 보입니다.한 명은

git tag -l

에, 다른 모든 태그에 대해서 순서가 어긋난 것을 나타냅니다.그것이 중요한지는 모르겠지만, 새로운 태그 오브젝트가 내가 원하는 것이 아니라는 것을 믿게 한다.태그명이 문서와 일치하는지 여부에만 관심이 있기 때문에, 저는 그것을 받아들일 수 있습니다.하지만 올바른 방법이 있다면 차라리 "올바르게" 하고 싶습니다.

Lightweight 태그의 이름을 변경하는 방법은 다음과 같습니다.old로로 합니다.new:

git tag new old
git tag -d old
git push origin new :old

push 명령어 콜론은 원격저장소에서 태그를 삭제합니다.이렇게 하지 않으면 Git은 풀할 때 기계에 오래된 태그를 만듭니다.마지막으로 다른 사용자가 삭제된 태그를 삭제했는지 확인합니다.다음 명령을 실행하도록 직원(동료)에게 알려주십시오.

git fetch --prune --prune-tags

주석 부착 태그의 이름을 변경할 경우 삭제하려는 이전 주석 부착 태그 개체가 아니라 새 태그 이름이 기본 커밋을 참조하는지 확인해야 합니다.이전 태그가 주석이 달린 태그이거나 확실하지 않은 경우^{}태그 이외의 오브젝트가 검출될 때까지 오브젝트를 참조 해제하려면 다음 절차를 수행합니다.

# create a new annotated tag "new" referencing the object
# which the old annotated tag "old" was referencing:
git tag -a new old^{}

태그 에는 OLD의 .「NEW」는 「올드의 에일리어스로서 됩니다.새롭다git tag NEW OLDOLD를 해 주세요.git tag -d OLD.

"Git way"와 (in) sanity에 관한 인용은 근거가 없습니다.태그명은 보존하고 있지만, 다른 저장소 상태를 참조하도록 하고 있기 때문입니다.

다른 답변과 함께:

먼저 원래 커밋을 가리키는 이전 태그 이름의 에일리어스를 작성해야 합니다.

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 태그 변경이 패키지 소비자에게 미치는 영향에 유의하십시오.

이 Wiki 페이지에는 다음과 같은 흥미로운 원라이너가 있습니다.이러한 내용은, 몇개의 레퍼런스를 푸시 할 수 있다는 것을 상기시켜 줍니다.

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> ,
  • 삭제::refs/tags/<old-tag>

를 들어 "git 저장소 내의 태그 명명 규칙을 변경하시겠습니까?"를 참조하십시오.


hIpPy가 댓글에 언급:

예전에는 태그를bin/tag-cleanup 다른 네이밍 형식으로 대량으로 복사했는데, 아주 잘 작동했어요.

#!/bin/sh

#usage:
#   ... | tag-cleanup
#
# Gen bulk-rename script for git tags from 'nuget-' to 'v'.

# todo: cleanup local tags
sed 's,nuget-,,' | \
    sed -E 's,(.+),nuget-\1 v\1,' | \
    sed -E 's,(.+) (.+),git push github refs/tags/\1:refs/tags/\2 :refs/tags/\1,' | \
    column -t -o ' '

hlpPy는 다음 스크립트에서의 사용을 나타냅니다.

$ git tag | grep -F 'nuget-' | tag-cleanup 

를 든든태 format format format format format format format format format format format format 형식으로 합니다.nuget-1.2.3을 정하다v1.2.3.
이 너무 좋다.nuget-태그 네이밍 포맷은 초기 제 실수였고, 잠시 수정하고 싶었습니다.

태그:

게시된 경우 삭제할 수 없습니다(즉, 타르나 페더링 위험이 있습니다).'기트 방식'은 다음과 같습니다.

제정신이야.네가 망쳤다는 걸 인정하고 다른 이름을 써봐다른 사람들은 이미 하나의 태그 이름을 보고 있고, 같은 이름을 가지고 있으면 두 사람 모두 "버전 X"를 가지고 있을 수 있지만, 실제로는 "X"가 다릅니다.그러니까 'X.1'이라고 부르면 끝이에요.

또,

미친 짓 말이야다른 사람들이 이미 이전 버전을 봤지만, 당신은 새 버전을 "X"라고 부르고 싶어합니다.다시 git-tag -f를 사용하면 이전 버전을 아직 공개하지 않은 것처럼 됩니다.

정말 말도 안 되는 이유:

Git은 사용자 뒤에 있는 태그를 변경하지 않습니다(그리고 변경하지 않아야 합니다).만약 누군가가 이미 오래된 태그를 가지고 있다면, 당신의 트리에서 git-pull을 실행한다고 해서 오래된 태그를 덮어쓰게 되는 것은 아닙니다.

만약 누군가가 당신에게서 릴리스 태그를 받았다면, 당신은 자신의 태그를 업데이트하여 그들을 위해 태그를 변경할 수 없습니다.이것은 사람들이 태그 이름을 신뢰할 수 있어야 한다는 점에서 큰 보안 문제입니다.네가 정말 미친 짓을 하고 싶다면, 그냥 그걸 받아들이고 사람들에게 네가 망쳤다고 말해야 해.

모두 man page에 의해 제공됩니다.

다른 답변에 덧붙여서 한 번에 모든 작업을 수행할 수 있도록 에일리어스를 추가했습니다. *nix move 명령어 느낌이 더 친숙합니다.인수 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

1개 또는 몇 개의 태그에 대해서는, 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>

기존 태그의 태그 정보를 사용하여 태그, 메시지, 태그 날짜 등의 모든 태그 정보를 포함하는 주석이 달린 중복 태그를 만들 수 있습니다.

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이전 태그 이름과 새 태그 이름이 일치하도록 값을 지정합니다.

이 명령어는 서명되지 않은 태그에만 대응합니다.단, 이 솔루션을 서명된 태그로 확장하는 것은 간단한 일입니다.

목표

진정으로 구별할 수 없는 이름 변경을 위해서는 주석이 달린 태그의 모든 요소가 새 태그에서 동일해야 합니다.설명서는 주석이 달린 태그의 일부를 지정합니다.

오브젝트로 )-a,-s , 「」-u는 "에는 작성 날짜,및 시그니처가 되어 있습니다).「 notated 」는, 「notated 」, 「notated 」, 「nuPG 」라고 불립니다.

회답 동기

내가 알기로는, 다른 모든 답변에는 미묘한 차이가 있거나 태그에 관한 모든 것을 완전히 복제하지 않는다(예를 들어 새로운 태그 날짜나 현재 사용자 정보를 태그로 사용한다).이 시나리오에는 적용되지 않지만 태그 재지정 경고를 호출하는 경우가 많습니다(태그명을 다른 커밋으로 이동하기 위한 것이지 이름이 다른 태그로 변경하기 위한 것이 아닙니다).저는 몇 가지 파헤쳐보고, 이러한 우려를 해결할 수 있는 해결책을 마련했습니다.

절차.

「」라고 하는 이름의 이 달린 .old예에서는 를하고 있으며, 은 "이름을 "이름을 "이 경우 "예외"로 .이름은new.

순서 1: 기존 태그 정보 가져오기

먼저 기존 태그에 대한 정보를 얻어야 합니다.이것은, 다음의 방법으로 실시할 수 있습니다.

명령어:

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는 'ID'로 할 수 .git tag.

git 환경변수를 사용하여 태그 정보(이름, 이메일, 날짜)를 설정할 수 있습니다. GIT_COMMITTER_NAME,GIT_COMMITTER_EMAIL,GIT_COMMITTER_DATE이 콘텍스트에서의 날짜 사용 방법에 대해서는, 다음의 「On Backdating Tags」를 참조해 주세요.git tag; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;.

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."

두 태그를 나란히 비교한 결과 모든 면에서 동일한 것으로 나타났습니다.여기서 유일하게 다른 점은 태그 자체의 커밋 참조입니다.이러한 참조는 2개의 다른 태그이기 때문에 상정됩니다.

명령어:

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 origin new :old

하면 「」가 됩니다.new하여 " " " 를 삭제합니다.old붙이다

모험심이 강한 사람에게는 다음 명령어 하나로 실행할 수 있습니다.

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

이미 푸시된 태그 푸시 및 태그 이름 변경과 관련된 문제에 관계없이 이름을 변경할 태그가 주석이 달린 태그인 경우 다음 한 줄 명령줄을 사용하여 먼저 복사할 수 있습니다.

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

아웃하지 않고 도 있습니다. 태그할 수도 있습니다.이전 태그/브런치를 새 이름으로 복제하여 오래된 태그를 한 번에 삭제할 수도 있습니다.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

언급URL : https://stackoverflow.com/questions/1028649/how-do-you-rename-a-git-tag