web-dev-qa-db-ja.com

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

今日、私はプロジェクトのログを調べていて、しばらく前に私は太ってタグ名を指で触れたことに気付きました。タグの名前を変更する方法はありますか?グーグルは何も役に立たなかった。

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

git tag -l

他のすべてのタグを基準にして順序が乱れています。それが重要であるかどうかはわかりませんが、新しいタグオブジェクトは私が望んでいるものとはまったく異なると信じるようになります。タグ名がドキュメントと一致していることを本当に気にしているだけなので、それに対応できますが、正しい方法があると仮定して「正しい」ようにしたいのです。

1086
Brandon Fosdick

タグの名前をoldからnewに変更する方法は次のとおりです。

git tag new old
git tag -d old
git Push Origin :refs/tags/old
git Push --tags

Pushコマンドのコロンは、リモートリポジトリからタグを削除します。そうしないと、引っ張ったときにGitがあなたのマシンに古いタグを作成します。

最後に、他のユーザーが削除されたタグを削除したことを確認してください。次のコマンドを実行するように同僚に伝えてください。

git pull --Prune --tags
1822
Casey Watson

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

それはタグ名を保存することについて話しているが、それを別のリポジトリの状態を参照するようにしているので、 "Git way"と(in)正気性に関する引用は根拠のないものです。

284
Greg McGary

他の答えに加えて:

最初に、元のコミットを指す old タグ名の alias を作成する必要があります。

git tag new old^{}

その後、古いものを削除する必要があります local

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

106
kaiser

公開されている場合は、削除することはできません(煩わしさを感じずに済ませることなしに)。 'Git way'は次のようになります。

正直なこと。あなたが失敗したことを認めて、違う名前を使ってください。他の人はすでに1つのtag-nameを見ています、そしてあなたが同じ名前を保持するならば、あなたは2人の人が両方とも "バージョンX"を持っているが実際には異なる "X"を持っている状況にあるかもしれません。それで、それを単に "X.1"と呼んでそれを使ってください。

あるいは

めちゃくちゃなこと。他の人がすでに古いバージョンを見たことがあるとしても、あなたは本当に新しいバージョンを "X"と呼ぶことを望みます。ですから、git-tag -fをもう一度使ってください。あたかもまだ古いものを公開していないかのように。

それはとてもめちゃくちゃです。

Gitはユーザーの背後にあるタグを元に戻すことはありません(そしてそうすべきではありません)。ですから、誰かが既に古いタグを手に入れているのなら、ツリーをgit-pullしても古いタグを上書きしてはいけません。

誰かがあなたからリリースタグを取得した場合、あなたはあなた自身のものを更新することによってそれらのタグを変更することはできません。人々は自分のタグ名を信頼できなければならないという点で、これは大きなセキュリティ問題です。あなたが本当に非常識なことをしたいのなら、あなたはただそれに戸惑い、あなたがめちゃくちゃであることを人々に伝える必要があります。

manページ のおかげで。

27
Robert Munteanu

この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>
  • <old-tag>の削除:<refs/tags/old-tag>

例として " gitリポジトリ内のタグの命名規則を変更しますか? "をご覧ください。

24
VonC

他の答えへの追加として、もっとよく知られている* nix移動コマンドの感触で、それをすべて一歩で行うためのエイリアスを追加しました。引数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
23
Jared Knipp

冒険のためにそれは1つのコマンドで行うことができます:

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

タグのプッシュやすでにプッシュされたタグの名前変更に関する問題に関係なく、名前を変更するタグがannotatedの場合は、次の単一行コマンドラインを使用して最初にコピーできます。

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

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

git tag -d old_tag

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

編集:
https://stackoverflow.com/a/49215190/7009806 で説明されているように)fetch.pruneTags=trueタグの自動同期を使用する際に問題が発生したので、個人的には first copyをお勧めします。サーバー上の新しいタグと 次に 古いタグを削除します。このように、古いタグを削除するときに新しいタグがランダムに削除されることはなく、タグの同期化によって新しいタグまだサーバー上にないを削除することを望みます。だから、たとえば、一緒に、私たちは得ます:

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
Olivier

簡単な部分はローカルタグの名前を変更することです。より困難な部分は遠隔のものです。このトリックの背後にある考え方は、チェックアウトせずに古いタグ/ブランチを新しいものに複製し、古いものを削除することです。

リモートタグ名の変更/リモートブランチ→タグ変換: (Notice::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
1
zionyx

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がタグ名を変更する準備ができたら、他の人がこれらを変更するためにこれらの変更をOriginにプッシュバックできます。

0
vikas pachisia