git에서 기존 태그 메시지를 어떻게 편집합니까?


225

git 저장소에 주석이 달린 여러 태그가 있습니다. 이전 태그에는 새로운 스타일로 업데이트하려는 가짜 메시지가 있습니다.

% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.

이 예에서는 v1.x 메시지를 v2.0 메시지처럼 보이게하려고합니다. 우리가 어떻게 할 것인지 아는 사람 있나요?


2
참고 : Git 2.17 (Q2 2018)에서는 간단 git tag -m "A message" --edit v1.0합니다. 아래 답변을
VonC


@VonC 그것을 시도하고 fatal: tag 'v6.6.2' already exists사용하여 받았습니다 2.17.0.
Josh Habdas

1
항상 이전 태그를 삭제하고 다시 수행 할 수 있습니다.
RoadRunner

답변:


264

git tag <tag name> <tag name>^{} -f -m "<new message>"

이렇게하면 동일한 이름의 새 태그가 만들어집니다 (원본을 덮어 써서).


7
이것이 원래 태그의 날짜를 유지합니까?
James M. Greene

16
내 의견 질문에 대한 답변 : 예, 날짜 변경됩니다. :(
James M. Greene

10
의 "태그 업데이트 중"섹션을 참조하십시오 git tag --help.
dahlbyk

6
또한 여러 메시지를 추가 할 수도 있습니다 (GitHub에서 새 줄로 분리)git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
Blair McMillan

5
내 대답은 아래에서 @ChrisMorley 외모 stackoverflow.com/a/23532519/603949 - 짧은 사용 <tag name>^{}하면 교체 할old tag
Sungam

87

복잡한 메시지를 업데이트하려면 주석이 달린 태그 옵션을 지정 -a하거나 부호가있는 태그 옵션을 지정하십시오 -s.

git tag <tag name> <tag name>^{} -f -a

이전 태그 메시지의 내용이 포함 된 편집기가 열립니다 .


39

git tag <tag name> <tag name>^{} -f -a

이것이 개선 된 것입니다. 그렇지 않으면 ^{}이전 태그 객체를 참조하는 새 태그 객체가 만들어지며 두 태그 모두 동일한 태그 이름을 갖습니다.

<tag name>^{} 첫 번째 커밋 해시를 찾을 때까지 태그 / 참조를 해결합니다.


4
@BrentFoust, 그것은 당신의 머리가 태그 된 커밋에있을 때만 작동합니다 usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
Sungam

33

TL; DR

날짜와 작성자를 스푸핑하는 동안 태그를 삭제하고 다시 작성하면됩니다.

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

전체 이야기:

Sungram구축 의 답변 (원래 편집으로 제안 됨) :

1. 수락 된 답변

이것은 AndyEric Hu 보다 개선 된 것입니다 의 답변에 . 그들의 답변은 이전 태그 객체를 참조하는 새로운 태그 객체를 생성하며 둘 다 동일한 이름을 갖습니다.

이를 설명하려면 다음을 고려하십시오.

> git tag tag1 tag1 -f -a  # accepted answer
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
260ab7928d986472895b8c55e54569b3f3cb9517 tag1
a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Original description]

[tagged commit details]

2. Sungram의 개선

대신 <tag name>^{}두 번째 인수로 사용하면 git tag이름이 같은 모든 이전 태그가 삭제됩니다.

이전 터미널 세션의 계속을 고려하십시오.

> git tag tag1 tag1^{} -f -a  # suggested improvement
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

[tagged commit details]

3. 날짜를 저장

마지막으로 원래 태그의 날짜를 업데이트 된 태그의 날짜로 유지하려면 awk (또는 유사한) 마술을 사용하거나 원하는 날짜를 붙여 넣으십시오. 다음은 두 번째 예를 대체 합니다 (그렇지 않으면 대체로 인해 원래 날짜가 손실 됨).

> GIT_COMMITTER_DATE="$(git show tag1 |                              # get info about the tag cascade including the date original of the original tag
> awk '{
>     if ($1 == "Date:") {
>         print substr($0, index($0,$3))
>     }
> }' |                                                               # extract all the dates from the info
> tail -2 | head -1)"                                               `# get the second to last date, as the last one is the commit date` \
> git tag tag1 tag1^{} -a -f                                         # finally, update the tag message, but save the date of the old one
>
> git rev-list --objects -g --no-walk --all
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
e18c178f2a548b37799b100ab90ca785af1fede0 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17
> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Updated description]

[tagged commit details]

참고 문헌 :

4. DIY

태그를 업데이트하는 대신 태그를 삭제하고 다시 만들 수 있습니다. 업데이트로 인해 새 태그가 추가되고 이전 태그를 가리 키거나 이전 태그를 암시 적으로 삭제하고 어쨌든 동일한 커밋을 가리키는 새 태그를 만듭니다.

다음을 발행하여이를 달성 할 수 있습니다.

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

[optional]선택적 필드는 다음과 같습니다 . <required>필수 필드입니다. 물론, git tag일반적으로 명령 뒤에 플래그를 추가 할 수 있습니다 .


3
"그들의 답변이 새로운 태그 객체를 생성 할 것"이라고 지적 해 주셔서 감사합니다!
cwhsu

인용 Andreas Schwab : The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
Ivan Vučica

11

@ 앤디의 솔루션

git tag <tag-name> <tag-name> -f -a

입니다 잘못된 . 그 후

git show

명령을 실행하면 이름이 같은 스택 태그가 표시됩니다.

커밋시 동일한 태그 이름과 새 메시지를 가진 새 태그를 추가합니다 <tag-name>. 그러나 오래된 태그는 제거하지 않습니다. 이 명령의 특별한 경우입니다.

git tag [<commit> | <old-tag>] <tag-name>

그러나 <old-tag>와 동일합니다 <tag-name>.


올바른 해결책은 간단합니다. 업데이트 태그 만 있으면됩니다.

git tag <tag-name> -f -a

만 기억 하나 여기를.

아닌 태그를 변경 HEAD하려면 추가 <commit>인수 가 필요합니다 .

git tag <commit> <tag-name> -f -a

예! 네가 옳아. 지적 해 주셔서 감사합니다. 주석이 달린 태그를 몇 번 다시 쓴 후 태그를 확인 git show <tag>하고 이전 버전을 모두 확인했습니다.
Manoel Vilela

문제는 : HEAD추가 하지 않은 일부 태그를 업데이트 해야하는 경우 <commit>열린 태그가 비어 있습니다. 이전 태그가 편집 될 것으로 예상했습니다. 방법이 있습니까?
Manoel Vilela

답변 한 이후 Andy의 솔루션이 업데이트되었습니다. 아마도 수정되었다는 메시지로 답을 시작하는 것이 좋을 것입니다. 또한 명령 git tag <commit> <tag-name> -f -a이 <commit>과 <tag-name>을 반대로 했을 수 있습니까? 다른 답변 및 문서와 비교할 때 이런 식으로 보이지만 전문가는 아닙니다.
Jacob Akkerboom

7

v1.x 메시지를 v2.0 메시지처럼 보이게하고 싶습니다

힘내 2.17 (Q2 2018)과 더불어, 창조에 대한 대안이 될 것입니다 와 태그를 git tag <tag name> <tag name> -f -m "<new message>""때문에 git tag"는 배운 명시 적으로 " --edit"옵션 "을 통해 주어진 메시지 수 -m"와 " -F더 편집 할 수"를.

Nicolas Morey-Chaisemartin ( )의 commit 9eed6e4 (2018 년 2 월 06 일)를 참조하십시오 . (가 합병 - Junio C 하마노 -05d290e 커밋 2018 06 마르)nmorey
gitster

tag: --edit옵션 추가

또는 에서 --edit제공 한 메시지를 수정할 수 있는 옵션을 추가하십시오 .-m-Fgit commit --edit


4
--editOP를 다루는 일관된 예제를 제공해 주 시겠습니까?
Josh Habdas

@JoshHabdas는 실제로 -f 옵션을 추가해야합니다. --edit는 메시지를 추가로 편집 할 수만 있습니다.
VonC

감사. 따라서 -f플래그가 추가 --edit되면 메시지를 편집하고 타임 스탬프를 수정합니다.
Josh Habdas

@JoshHabdas 그 아이디어입니다.
VonC

4

-fforce 플래그를 사용하여 태그를 다시 지정해야합니다 .

git tag v1.0 -f -m "actual message"

3
이 솔루션은 현재 자식 헤드가 버전 1.0이라고 가정합니다. 버전 1.0과 관련된 개정을 변경하므로 그렇지 않은 경우 문제가 발생할 수 있습니다. Andy의 솔루션은 이러한 함정을 피합니다.
Eric O Lebigot

4

위의 답변을 사용하여 이것은에 대한 별칭 별칭입니다 .gitconfig. 기존 태그를 교체하고 커밋 날짜를 유지합니다.

[alias]
    tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '"

개량?


1
또한 저자를 유지 : tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
minterior

1
이것을 시도했습니다. 대체 태그에 작성자 및 날짜 정보를 태그 자체에서 제공하는 대신 태그가 가리키는 커밋의 정보를 사용합니다. 이것은 반드시 동일 할 필요는 없으며, 사실 대부분의 경우 동일하지 않습니다. 우리는 다중 저장소 인프라를 가지고 있으며 '핵심'저장소에 주석이 달린 태그를 사용하여 여러 저장소에 걸친 푸시에 대한 정보를 기록합니다. 따라서 핵심적으로 커밋이 실제 푸시의 일부가 아닐 수도 있습니다. 주석이 달린 태그의 정보는 다른 저장소의 실제 푸시를 반영해야합니다.
tanager

0

당신은 같은 GUI 사용하는 경우 smartgit를 단지

  1. 새 메시지와 같은 위치에 같은 태그를 다시 작성하십시오.
  2. "기존 태그 덮어 쓰기"를 선택하십시오.
  3. 태그를 업스트림 저장소로 강제 푸시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.