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(2018年第2四半期)では、シンプルgit tag -m "A message" --edit v1.0で十分です。以下の私の回答を
VonC '10年


@VonCはそれを試して、をfatal: tag 'v6.6.2' already exists使用して受け取りました2.17.0
Josh Habdas

1
以前のタグをいつでも削除して、再度実行することができます。
RoadRunner 2018

回答:


264

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

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


7
これは元のタグの日付を維持しますか?
James M. Greene

16
私自身のコメントの質問への回答:はい、日付変更されます。:(
James M. Greene

10
の「Backdatingタグについて」セクションを参照してくださいgit tag --help
dahlbyk 2013年

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 '9/10/9

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]

全編:

サングラム上に構築の回答(元は編集として提案):

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

<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番目の例の代替です(そうしないと、オーバーライドのために元の日付が失われます)。

> 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 2016年

Andreas Schwabの引用The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
IvanVučica17年

11

@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

はい!あなたが正しい。それを指摘してくれてありがとう。注釈が付けられたタグを数回書き換えた後、タグをチェックgit show <tag>したところ、以前のすべてのエディションが表示されました。
Manoel Vilela

問題はHEAD、でないタグを更新する必要がある場合、追加のを渡すと、<commit>開いたタグが空になることです。古いタグは編集するだけだと思っていました。道はありますか?
Manoel Vilela 2017

Andyのソリューションは回答後に更新されています。おそらく、それが修正されたというメッセージから回答を始めるのは良いことでしょうか?また、コマンドのgit tag <commit> <tag-name> -f -a<commit>と<tag-name>が逆になっている可能性もありますか?他の回答やドキュメントと比較すると、このように見えますが、私は専門家ではありません。
Jacob Akkerboom

7

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

Git 2.17(2018年第2四半期)では、 git tag <tag name> <tag name> -f -m "<new message>"、「git tag新しいタグ、「」が「」と「」を介してメッセージを許可する明示的な「--edit」オプションを学習したため、-m-F」をさらに編集。

Nicolas Morey-Chaisemartin()によるcommit 9eed6e4(2018年2月6日)を参照してください。nmorey
(合併によりJunio C浜野- gitster-05d290eコミット 2018年3月6日)

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

または--editによって提供されるメッセージを変更できるオプションを追加します-m-F、同じようにgit 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
このソリューションは、現在のgitヘッドがバージョン1.0であることを前提としています。バージョン1.0に関連付けられたリビジョンが変更されるため、そうでない場合、これは混乱する可能性があります。アンディのソリューションはこの落とし穴を回避します。
Eric O Lebigot

4

上記の回答を使用すると、これはの私のエイリアスの1行です.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.