今日、私はプロジェクトのログを調べていて、しばらく前に私は太ってタグ名を指で触れたことに気付きました。タグの名前を変更する方法はありますか?グーグルは何も役に立たなかった。
タグ付きバージョンをチェックアウトして新しいタグを作成できることに気づきました。しかし、それはまったく正しくないタグオブジェクトを作成するようです。一つには、
git tag -l
他のすべてのタグを基準にして順序が乱れています。それが重要であるかどうかはわかりませんが、新しいタグオブジェクトは私が望んでいるものとはまったく異なると信じるようになります。タグ名がドキュメントと一致していることを本当に気にしているだけなので、それに対応できますが、正しい方法があると仮定して「正しい」ようにしたいのです。
タグの名前を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
元の質問は、タグの名前を変更する方法です。これは簡単です。最初にOLD:git tag NEW OLD
のエイリアスとしてNEWを作成し、次にOLD:git tag -d OLD
を削除します。
それはタグ名を保存することについて話しているが、それを別のリポジトリの状態を参照するようにしているので、 "Git way"と(in)正気性に関する引用は根拠のないものです。
他の答えに加えて:
最初に、元のコミットを指す 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の変更がパッケージの消費者に を与えるということの影響に注意してください。
公開されている場合は、削除することはできません(煩わしさを感じずに済ませることなしに)。 'Git way'は次のようになります。
正直なこと。あなたが失敗したことを認めて、違う名前を使ってください。他の人はすでに1つのtag-nameを見ています、そしてあなたが同じ名前を保持するならば、あなたは2人の人が両方とも "バージョンX"を持っているが実際には異なる "X"を持っている状況にあるかもしれません。それで、それを単に "X.1"と呼んでそれを使ってください。
あるいは
めちゃくちゃなこと。他の人がすでに古いバージョンを見たことがあるとしても、あなたは本当に新しいバージョンを "X"と呼ぶことを望みます。ですから、git-tag -fをもう一度使ってください。あたかもまだ古いものを公開していないかのように。
それはとてもめちゃくちゃです。
Gitはユーザーの背後にあるタグを元に戻すことはありません(そしてそうすべきではありません)。ですから、誰かが既に古いタグを手に入れているのなら、ツリーをgit-pullしても古いタグを上書きしてはいけません。
誰かがあなたからリリースタグを取得した場合、あなたはあなた自身のものを更新することによってそれらのタグを変更することはできません。人々は自分のタグ名を信頼できなければならないという点で、これは大きなセキュリティ問題です。あなたが本当に非常識なことをしたいのなら、あなたはただそれに戸惑い、あなたがめちゃくちゃであることを人々に伝える必要があります。
manページ のおかげで。
この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リポジトリ内のタグの命名規則を変更しますか? "をご覧ください。
他の答えへの追加として、もっとよく知られている* 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
冒険のためにそれは1つのコマンドで行うことができます:
mv .git/refs/tags/OLD .git/refs/tags/NEW
タグのプッシュやすでにプッシュされたタグの名前変更に関する問題に関係なく、名前を変更するタグが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
簡単な部分はローカルタグの名前を変更することです。より困難な部分は遠隔のものです。このトリックの背後にある考え方は、チェックアウトせずに古いタグ/ブランチを新しいものに複製し、古いものを削除することです。
リモートタグ名の変更/リモートブランチ→タグ変換: (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つまたは少数のタグについては、3ステップのアプローチに従ってください。
command: git rev-parse <tag name>
example: git rev-parse v0.1.0-Demo
example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde
command: git tag -d <tag name>
example: git tag -d v0.1.0-Demo
example output: Deleted tag 'v0.1.0-Demo' (was abcde)
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にプッシュバックできます。