Gitタグの名前をどのように変更しますか?


1219

今日、私はプロジェクトのログを調べていて、少し前にタグ名を太っていることがわかりました。タグの名前を変更する方法はありますか?グーグルは何も有用なものを見つけていません。

タグ付けされたバージョンをチェックして新しいタグを作成できることに気づき、それを試してみました。しかし、これは正しくないタグオブジェクトを作成するようです。一つには、

git tag -l

他のすべてのタグとの関係で順不同でリストします。それが重要であるかどうかはわかりませんが、新しいタグオブジェクトが私が望んでいるものとはまったく違うと信じるようになりました。タグ名がドキュメンテーションと一致することを本当に気にするだけなので、私はそれで暮らすことができますが、これを行う正しい方法があると仮定して、「正しい」ようにしたいと思います。


同じ呼び出しを使用しましたか、つまり、古いタグが注釈付き/署名付きタグである場合、新しいタグもこの種類のものですか、それとも軽量タグですか?
JakubNarębski、2009年

1
正しくない古いタグと必要な新しいタグの両方に注釈を付け、署名しないでください。古いタグは 'git tag -a bad_tag_name'で作成されたので、 'git tag -a good_tag_name'に沿って何かしたいと思います。
ブランドンフォスディック

名前を変更するタグの注釈を保持するために、この魔法のタグ名変更プロセスも必要であることを指摘しておきます。実は名前だけ変えたいです。
ブランドンフォスディック

7
git log --oneline --decorate --graphタグをクリーンアップするときに役立ちます。
Joel Purra、2012年

タグの名前は1行で変更できます。以下の私の回答を
VonC

回答:


2039

タグの名前を次のように変更oldnewます。

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 2013

25
git push origin :refs/tags/old単純化できるとgit push origin :old思います。
Jesse Glick 2014年

25
"git push --tags"をこのタグ "git push origin refs / tags / new"に対してより明示的に変更することをお勧めします。誤って他のタグをプッシュしたくない場合。
14:18にchrish

11
警告:を使用git tag new oldすると、古いタグのコミットではなく、古いタグを指すタグが作成されます。(Git GUIからタグをチェックアウトできないのはなぜですか?
Stevoisiak

297

元の質問は簡単にタグの名前を変更する方法でした。最初にOLDのエイリアスとしてNEWを作成し、git tag NEW OLD次にOLD:を削除しましたgit tag -d OLD

「Gitの方法」と(健全性)に関する引用は、タグ名の保持について話しているが、別のリポジトリ状態を参照するようにしているため、根拠がありません。


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タグの変更がパッケージの消費者に与える影響に注意してください。


警告:を使用git tag new oldすると、古いタグのコミットではなく、古いタグを指すタグが作成されます。(Git GUIからタグをチェックアウトできないのはなぜですか?
Stevoisiak

1
@StevenVascellaroリンクありがとうございます。次回は、編集を提出してください–回答もコミュニティの努力です。ありがとう。
カイザー

まだ自分でコードをテストしていないため、編集はしませんでした。(リンクされた質問の提出日に注意してください)
Stevoisiak

一度実行したらgit tag new old^{}、その後は必要ありませんgit tag new_tag_name old_tag_name(最初のステップ)。
Number945

28

公開されている場合、削除することはできません(つまり、風袋引きや羽毛除去のリスクはありません)。「Gitの方法」は次のようにすることです:

正気なこと。失敗したことを認め、別の名前を使用してください。他の人はすでに1つのタグ名を見たことがあります。同じ名前を保持している場合、2人のユーザーが両方とも「バージョンX」を持っているが、実際には「X」が異なるという状況にあるかもしれません。だからそれを「X.1」と呼んでそれで終わりです。

または、

非常識なこと。他の人がすでに古いバージョンを見ているにもかかわらず、あなたは本当に新しいバージョンも "X"と呼びたいと思っています。したがって、古いものをまだ公開していないかのように、もう一度git-tag -fを使用します。

次の理由から、それは非常に正気ではありません。

Gitは、ユーザーの背後にあるタグを変更しません(変更しないでください)。したがって、誰かがすでに古いタグを取得している場合、ツリーでgit-pullを実行しても、古いタグが上書きされるだけではありません。

誰かがあなたからリリースタグを受け取った場合、自分のタグを更新して、それらのタグを変更することはできません。これは大きなセキュリティ問題であり、人々は自分のタグ名を信頼できなければならない。あなたが本当に狂ったことをしたいのなら、それをやっつけて、失敗したことを人々に告げる必要があります。

マニュアルページのすべての礼儀。


6
または、この誤った名前のタグに(正しい名前で)タグを付けることができます。
JakubNarębski、2009年

6
おかげで、私はそのmanページを100万回以上閲覧しました。幸い、悪いタグはどこにも公開されていません。仮にそうだったとしても、これは内部プロジェクトであり、私は(今のところ)唯一の開発者です。タールとフェザリングの両方から私はかなり安全だと思いますが、ドキュメントに一致するリポジトリを取得できる場合のみです。
ブランドンフォスディック

私は時々、自分の個人的な参照にタグを使用します。例えば。「ok_jb」タグの場合もあります。私がこれを使用しているのは、作業している人の一部が私のプラットフォーム用にビルドできないため、ビルドエラーが発生する場合があるためです。その後、そのタグをチェックアウトすることで、ビルドするバージョンをすばやく取得できます。新しいソースがビルドされたら、タグを移動するか、名前をbuilds ##に変更します。##は番号です(プロジェクトによって異なります)。タグを追加して、特別な機能が導入されたときに強調することもできます。

7
悪い答え。「Do n't do it」は「How can I do it it?」の正しい答えにはなりません。ユーザーは、それを行うのが良い考えだと思うのか、それとも人々がそれを好きになるのかと尋ねていませんでした。誰かが「どうすれば手を切ることができるか」と尋ねられた場合は、それをどのように行うかを彼に教えるか、彼を放っておいてください。そして、あなたはそれを行うことができます。新しいタグを追加したり、古いタグを削除したりできます。リモートリポジトリでも技術的には可能です。
Mecki 2015年

5
これは、「既存のタグを別のリビジョンにポイントさせる方法を教えてください」という質問に答えるようです。OPの質問の代わりに、「タグの名前を変更するにはどうすればよいですか?」また、あなたが台無しになったことを人々に告げることで問題がどのように解決されるかについても(一般的には良い考えですが)不明です。
LarsH

25

このWikiページには、この興味深い1行があり、いくつかの参照をプッシュできることを思い出させます。

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

1
これにより、元のタグ名が注釈付きタグの注釈に残ることに注意してください!! 少なくとも現在のバージョンでは、それが実際に何かを意味するかどうかはわかりません。
gbr

@gbr注釈に「元のタグ名」が残っていることを示す例で回答を編集できますか?
VonC、2015

1
@VonC私はあなたが何を求めているのか理解できません。多分私ははっきりしていませんでした:注釈オブジェクトには、タグの名前に設定されたタグフィールドが含まれていgit cat-file -p <tag>ます。私のシステムであなたのメソッドを使用すると、「名前が変更された」タグ参照(<new-tag>)を取得しますが、そのタグフィールドはまだ<old-tag>です。
gbr

3
@gbr OPが望んだものではありませんか?彼は、「名前が変更されるタグからの注釈を保持するために、この魔法のタグ名変更プロセスも必要であることを指摘しておきます。実際には、名前のみを変更し、それ以外は何も変更しません」(stackoverflow.com/questions/1028649/ how-do-you-rename-a-git-tag /…
VonC 2015

25

他の回答への追加として、より馴染みのある* nix moveコマンドの感覚で、1つのステップでそれを行うエイリアスを追加しました。引数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"
Sunny Patel

10

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でタグ名を変更する準備ができたら、これらの変更を他の人が取得できるようにオリジンにプッシュバックできます。


削除されたタグをプッシュバックするための手順が欠落しています:(git push origin :refs/tags/v0.1.0-Demo他の保留中のものとともに)タグをプッシュバックするためgit push --tags
Star Wolf

6

冒険好きな方は、1つのコマンドで実行できます。

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

7
これは、参照がパックされている場合、つまりgit gc最近実行した場合は機能しません
forivall

2
これはローカルリポジトリのみに影響します。リモートが構成されている場合、これがどのような悪影響を引き起こす可能性があるかはわかりません。このアプローチはお勧めしません。
therealklanni 2013年

1
注釈付きタグの場合、他のものの間の「注釈」ブロブにはタグの元の名前が含まれているため、これはおそらくさらに厄介になることにも注意してください。実際にそれが何かで使用されているかどうかはわかりませんが(できれば少なくともverify-tagで)、チャンスはありません。
gbr

1
@gbrこれは問題なく動作します。(もちろん、@ forivallによるメモも考慮されます。)このトリックは、ALTシーシュポスビルドシステムで古くから使用されてきました。パッケージのソースがどのように保存されているかを確認してください(例:git.altlinux.org/gears/g/gear.git)2.0.7-alt1のような読み取り可能なタグは、メンテナーがビルドシステムに送信する署名付きタグです。不可解なタグgb-sisyphus-task164472.200がビルドシステムによってそこに配置され、このソースからpkgをビルドして公開したタスクIDを追跡します。それらはばかげたコピー(cp)であり、メンテナのメッセージはそのままです。
imz-Ivan Zakharyaschev 2016年

@ imz--IvanZakharyaschev知っておくと良いことですが、一部の製品では、将来的に問題が発生することはないと思いますが、あまり信用しません。gitリポジトリ形式と期待される相互作用の実際の仕様はないため、それが実行可能である場合、私は最も驚くべき方法で物事をきれいに実行するように努力します
gbr

3

タグのプッシュと既にプッシュされているタグの名前変更に関する問題に関係なく、名前を変更するタグが注釈付きのタグである場合は、次の1行のコマンドラインを使用して、最初にコピーできます。

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

次に、古いタグを削除するだけです。

git tag -d old_tag

次の2つの答えのおかげで、このコマンドラインが見つかりました。

編集:
設定タグの自動同期使用して問題が発生した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

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.