web-dev-qa-db-ja.com

gitで既存のタグメッセージを編集するにはどうすればよいですか?

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メッセージのように見せたいと思います。誰も私たちがこれをどのように行うか知っていますか?

196
jared

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

これにより、同じ名前の新しいタグが作成されます(元のタグが上書きされます)。

226
Andy

複雑なメッセージを更新するには、注釈付きタグオプションを-aで指定するか、署名付きタグオプションを-sで指定するだけです。

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

これにより、エディターが開きます古いタグメッセージの内容と共に

76
Eric Hu

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

これは Andy および Eric Hu's の回答よりも改善されています。それらの回答は、古いタグオブジェクトを参照する新しいタグオブジェクトを作成します。両方のタグ名は同じです。

<tag name>^{}は、最初のコミットハッシュが見つかるまでタグ/参照を解決します。

37
Sungam

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 's answer(もともと編集として提案された)に基づいて:

1.受け入れられた答え

これは Andy および Eric H の回答に対する改善です。それらの回答により、古いタグオブジェクトを参照する新しいタグオブジェクトが作成され、両方とも同じ名前になります。

これを説明するために、次のことを考慮してください。

> 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.サングラムの改善

<tag name>^{}の2番目の引数として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(または同様の)魔法を使用するか、代わりに希望する日付を貼り付けます。以下は、2番目の例のsubstituteです(オーバーライドしないと、元の日付は失われます)。

> 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コマンドの後に通常のようにフラグを追加できます。

30
stanm

@Andyのソリューション

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

間違ったです。その後、

git show

コマンドを実行すると、同じ名前のスタックタグが表示されます。

コミット<tag-name>で同じタグ名と新しいメッセージを持つ新しいタグを追加します。ただし、古いタグは削除されません。このコマンドの特殊なケースです。

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

ただし、<old-tag><tag-name>と同じです。


正しい解決策は簡単で、更新タグだけでOKです。

git tag <tag-name> -f -a

ここでONEのみを思い出してください。

HEADではないタグを変更する場合は、<commit>引数を追加する必要があります。

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

v1.xメッセージをv2.0メッセージのように見せたい

Git 2.17(2018年第2四半期)では、「git tag <tag name> <tag name> -f -m "<new message>"」が---を学習したため、git tagnewタグを作成する代わりになります明示的な「--edit」オプションこれにより、「-m」および「-F」で指定されたメッセージをさらに編集できます。

コミット9eed6e4 (2018年2月6日) Nicolas Morey-Chaisemartin(nmorey を参照してください。
C浜野順夫-gitster- in commit 05d290e 、06 Mar 2018)に合併)

tag--editオプションを追加

--editオプションと同様に、-mまたは-Fによって提供されるメッセージを変更できるgit commit --editオプションを追加します。

5
VonC

上記の答えを使用すると、これは.gitconfigのエイリアスワンライナーです。既存のタグを置き換え、コミット日を保持します。

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

改善?

4
h0tw1r3

-f forceフラグを使用して、再度タグ付けする必要があります。

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