リモートタグを削除する方法


3421

すでにプッシュされているGitタグをどのように削除しますか?

回答:


5754

リモートタグ名への「空の」参照をプッシュする必要があるだけです。

git push origin :tagname

または、より明確に、--deleteオプションを使用します(または-dgitバージョンが1.8.0より古い場合):

git push --delete origin tagname

gitにはタグ名前空間とブランチ名前空間があるため、ブランチとタグに同じ名前を使用できることに注意してください。タグの代わりに誤ってブランチを削除しないようにする場合は、ブランチを削除しない完全な参照を指定できます。

git push origin :refs/tags/tagname

ローカルタグも削除する必要がある場合は、次を使用します。

git tag --delete tagname

バックグラウンド

ブランチ、タグ、またはその他の参照をリモートリポジトリにプッシュするには、「どのリポジトリ、どのソース、どの宛先か」を指定する必要があります。

git push remote-repo source-ref:destination-ref

マスターブランチをオリジンのマスターブランチにプッシュする実際の例は次のとおりです。

git push origin refs/heads/master:refs/heads/master

デフォルトのパスのため、これは次のように短縮できます。

git push origin master:master

タグは同じように機能します。

git push origin refs/tags/release-1.0:refs/tags/release-1.0

これは次のように短縮することもできます。

git push origin release-1.0:release-1.0

ソース参照(コロンの前の部分)を省略すると、宛先に「何もない」がプッシュされ、リモートエンドの参照が削除されます。


187
+1は、質問への回答と一般的なケースの説明の両方、および簡潔な構文の意味の詳細
Peter Host

77
そして、誰かが一度に複数のタグを削除する方法を疑問に思った場合に備えて、空白を使用してそれらをリストするだけですgit push --delete origin tag1 tag2。ローカルタグの削除についてもgit tag -d tag1 tag2
同様

8
タグ名がブランチ名と衝突する場合、ブランチを削除してしまう可能性があります。ははは。2番目の答えを参照してください-よりエコロジカルです
zuba

1
@EmmaHe A tagは単一のコミットにのみアタッチされます。そのため、ブランチ名は無関係です。
cb2 2017

1
それがgit tag -d `git tag`すべてのローカルタグを削除することを知ることも興味深いです。git push --delete origin `git tag`リモートタグをローカルにプルしたと仮定した場合も同様です。これはテスト環境では便利でした。
DarkFranX 2018

383

より簡単な方法は

git push --delete origin YOUR_TAG_NAME

この状況では、IMO接頭辞のコロン構文は少し奇妙です


4
これは適切な方法だと思います...他の構文は私にとってハックのように見えます。
Luigi R. Viggiano

11
うん、これはシンプルで機能します。可変部分は何であるかを指定して答えを明確にしますがgit push --delete origin "TAGNAME"、ここで、TAGNAMEは元のタグの名前です。
Teemu Leisti 2013年

12
これは機能します。1つの追加:同じ名前のブランチとタグがある場合tag、タグ名の前に単語を置いて、ブランチではなくタグを確実に取得できます。
andypaxo 2013年

9
@andypaxoコマンドが取るのはrefspecsです。正しい方法はrefs/tags/、次のようにタグの前にを付けることですrefs/tags/v2.3.1
p3lim 2015年

リモートサーバーで何らかの方法で「不正な」タグ名を作成しましたが、特殊な文字が含まれているため、同期できません。そのため、提案を使用して単に削除してください:git push --delete origin "service-<default>- 151インチ、intellij、stash、sourceTreeでは削除できません。よろしくお願いします!
Dmitri Algazin

215

v0.1.0削除するリモートタグがあり、リモートがのorigin場合は、次のようにします。

git push origin :refs/tags/v0.1.0

タグをローカルで削除する必要がある場合:

git tag -d v0.1.0

Gitの異常な削除構文の説明については、Adam Francoの回答を参照してください:


2
これはjgitでも動作します。:tag省略形はjgitでは機能しません
rynop

ええとfatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1…?
Chaim Eliyah 2016

3
@ChaimEliyahあなたは先行スラッシュを持っています、多分それはあなたの問題です
ジョフリー

5
これは、ブランチと同じ名前のタグがある場合にも機能するため、より適切な回答です。
Erik A. Brandstadmoen 2018

ジャストは:tagname、リモート削除のために働く必要があります。
アキュメニュー

106

すべてのローカルタグを削除し、リモートタグのリストを取得します

git tag -l | xargs git tag -d
git fetch

すべてのリモートタグを削除

git tag -l | xargs -n 1 git push --delete origin

ローカルタグを整理する

git tag -l | xargs git tag -d

2
ローカルおよびリモートのリポジトリからすべてのタグを削除する方法。これは私が探していたものです、ありがとう!
ホルヘオルピネル2014

git fetch、リモートを削除してからローカルをクリーンアップし、美しく動作しました!
DiegoRBaquero 2017年

遅いが、最も簡単
Lucent Fox

34

リモートリポジトリからタグを削除するには:

git push --delete origin TAGNAME

ローカルでタグを削除することもできます:

git tag -d TAGNAME

したがって、1行で両方を実行できますgit push --delete origin TAGNAME && git tag -d TAGNAME
。– sakurashinken

25

端末から次のようにします。

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

Github.comにアクセスして更新すると、表示されなくなります。


3
タグではなくgitタグ
DSF 2018

23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. 1行目、ローカルリポジトリyour_tag_nameから削除します。
  2. 2行目、リモートリポジトリyour_tag_nameから削除します。
  3. プレス破棄ドラフトあなたのGitHubでボタンリリースのセクション。

ここに画像の説明を入力してください


2
このコマンドは質問に回答する場合がありますが、このコードが質問に回答する理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。回答方法
ポポ

20

ローカルタグ「12345」を削除

git tag -d 12345

リモートタグ「12345」を削除します(例:GitHubバージョンも)

git push origin :refs/tags/12345

代替アプローチ

git push --delete origin tagName
git tag -d tagName

ここに画像の説明を入力してください


15

リモートタグとして名前が付けられたリモートブランチがある場合、これらのコマンドがあいまいであることに注意してください。

git push origin :tagname
git push --delete origin tagname

したがって、次のコマンドを使用してタグを削除する必要があります。

git push origin :refs/tags/<tag>

そしてこれはブランチを削除するためのものです:

git push origin :refs/heads/<branch>

そうでない場合、次のようなエラーが発生します。

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'

短くて簡潔。この投稿は、MeganZhouと一緒に、なぜ問題が発生したのかに対する答えとして飛び出し、branchnameとtagnameは同一でした。ローカルタグを削除して:refs / tagsにプッシュしましたが、すべて問題ありませんでした。
rwheadon 2017

12

数千のリモートタグに対して最大100倍高速な方法

11,000を超えるタグを削除する必要がある間にこれらの回答を読んだ後、これらの方法は信頼できるかxargs、非常に長い時間がかかることを学びました。

苦労して、私は2つのはるかに速い方法を見つけました。どちらの場合も、git tagまたはで開始しgit ls-remote --tagsて、リモートで削除するタグのリストを作成します。以下の例ではsorting_proccessing_etc、任意のgreping、sorting、tailing、またはheadingを省略または置き換えることができます(例: grep -P "my_regex" | sort | head -n -200 など)。


この最初の方法は、を使用するよりもはるかに高速で、おそらく20〜100 高速で、一度にxargs少なくとも数千のタグで機能します。

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

これはどのように作動しますか?通常の、行で区切られたタグのリストは、スペースで区切られた単一行のタグに変換され、それぞれの前に:soが付加されます。。。

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

git pushこのフォーマットタグで使用すると、各リモート参照に何もプッシュされ、それが消去されます(この方法でプッシュするための通常のフォーマットはですlocal_ref_path:remote_ref_path)。

方法2は、この同じページの別の場所に別の回答として記載されています


これらの両方の方法の後、おそらくローカルタグも削除する必要があります。私たちが使用して戻って行くことができるので、これははるかに高速であるxargsgit tag -d、、これで十分です。

git tag | sorting_processing_etc | xargs -L 1 git tag -d

またはリモート削除と同様:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")

これをいくつかの異なる答えに分割する必要があります。1行に複数のタグがある答えは、間違いなく、タグの一括削除の正しい答えです。この情報を他のどこにでも見つけるのは実際には少し難しいです。私が探しているものを知っていても、gitヘルプページで見つけるのに苦労します:)称賛し、それを正しい答えとして強調表示して、GitHub APIを別の場所に移動してください。そして最後に、ローカルで一括してタグを削除すると、スペース区切りのタグが機能します(コロンを取り除く)
CubanX

賞賛と提案をありがとう。これを分割します。ローカルタグの削除に関するコメントを理解できません。私の最後のコマンドスニペットでコロンを使用しているとは思いませんが、モバイルを使用しているため、何か不足している可能性があります。
TonyH 2017

申し訳ありませんが、リモートタグを削除するために行っていること、ローカルタグを削除することで機能し、リスト全体を一度に提供することを意味しました。:) git push origin:tag1:tag2などの代わりにgit tag --delete tag1 tag2 tag3を実行すると、完全にクリーンアップできます。再び、トンに感謝します!
CubanX 2017

11

優れたGit GUIであるSourceTreeを使用している場合は、次のようにすることで、コマンドラインなしでこれを簡単に実行できます。

  1. SourceTreeでリポジトリを開く
  2. 左側の[タグ]タブを選択して展開します
  3. 削除するタグを右クリックします
  4. [YOUR_TAG_NAMEを削除]を選択します
  5. 確認ウィンドウで、[リモートからタグを削除]を選択します

YOUR_TAG_NAMEがローカルリポジトリとすべてのリモートから削除されます-GitHub、BitBucket、またはそのリポジトリのリモートとしてリストした他の場所に。

また、タグをローカルで削除したが、リモートオリジンでは削除せず、すべての場所で削除したい場合は、オリジンと同じコミットで同じ名前で添付される新しいタグを作成します。次に、上記の手順を繰り返して、すべての場所を削除します。


魅力のように機能します。ありがとう!
Native_Mobile_Arch_Dev 2018


7

PowerShellを使用していて、それらの束を削除したい場合:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

もちろん、削除する前にフィルタリングすることもできます:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }

それはスムーズで良い正規表現の例でした。ありがとうございました
Yunus

7

@CubanXが示唆したように、この回答を元の回答から分割しました。

これはxargs、調整に比べて数倍高速であり、さらに調整すると大幅に拡張される可能性があるメソッドです。個人用のアクセストークンであるGithub APIを使用し、ユーティリティを活用しますparallel

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallelには多くの操作モードがありますが、一般的に、コマンド数を並列化すると同時に、プロセス数に制限を設定できます。--jobs 2パラメータを変更してより高速な操作を可能にすることができますが、Githubのレート制限に問題がありました。現在の制限は5000 / hrですが、文書化されていない短期的な制限もあるようです。


この後、おそらくローカルタグも削除する必要があります。これははるかに高速なので、xargsandの使用に戻ることができますがgit tag -d、これで十分です。

git tag | sorting_processing_etc | xargs -L 1 git tag -d

これは、受け入れられた回答よりもはるかに複雑なようです。メリットは何ですか?
theUtherSide 2017

2
数千のタグを削除する必要がある場合、速度は10〜100倍速くなります
TonyH

明確にしていただきありがとうございます。OPは、単一のタグの削除について尋ねました。なぜ誰かがこの方法を単一のタグに使用するのか想像もつきませんでした。おそらく、この回答は、多くのタグを削除することを含む別の質問
TheUtherSide

存在しないと思います。自分で答えるためにそれを作成することができました。それが適切だと思いますか?
TonyH 2017

1
私がやります!ここではかなり一般的な習慣だと思います。
theUtherSide 2017

6

他の回答はこれを達成する方法を指摘していますが、これはリモートリポジトリであるため、結果に留意する必要があります。

On Retaggingセクションのgit tagのmanページには、リモートリポジトリの他のユーザーに変更を丁寧に通知する方法が詳しく説明されています。彼らは、他の人があなたの変更をどのように得るべきかを伝えるための便利な発表テンプレートさえ提供します。


6

パターンに一致するタグを除くすべてのタグを削除して、過去2か月以外のすべての製品タグを削除できるようにしたいと思いました。

すべてのリモートタグを削除し、式を削除から除外する

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

すべてのローカルタグを削除し、式を削除から除外

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

5

ローカルと元の場所の両方から特定のタグを削除する簡単なスクリプト。タグが実際に存在するかどうかを確認します。

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

使い方:

  • シェルスクリプトファイル(git-tag-purge.shなど)を作成し、コンテンツを貼り付けます。
  • スクリプトファイルをchmodして実行可能にします。
  • スクリプトをグローバルに利用可能にする
  • gitプロジェクトにcdします
  • スクリプトを呼び出す(例
    $> git-tag-purge.sh tag_name

4

xargsすでに何かのために多くの作業が行われているようです。このスレッドを振り返ってみてxargs、あなたが経験したことの遅さは、xargs -n 1本当に必要がなかったときに元の答えが使用されたためだと思います。

これはxargs、コマンドラインの最大長を自動的に処理することを除いて、メソッド1と同じです。

git tag | sorting_processing_etc | xargs git push --delete origin

xargsプロセスを並行して実行することもできます。方法2 xargs

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

上記では、最大5つのプロセスを使用して、各プロセスで最大100の引数を処理します。引数を試して、ニーズに最適なものを見つけることができます。


面白い。あなたは毎日Unixコマンドについて何か新しいことを学びます。この代替案でユースケースをテストする必要があります。
TonyH 2017

4

文字で始まるタグを作成した場合、たとえば#ST002、uは通常のパターンを使用して削除できない場合があります。すなわち

git tag -d #STOO2

タグは削除しませんが、文字列リテラルでそのようにラップします

git tag -d "#ST002" or git tag -d '#ST002'

削除されます。を使ってタグ名を書くのを間違えた人を助けることを願っています。


2

これは、リモートをいじらずにローカルでテストするローカルテストケースです。

~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest

1

こんにちは、私が作成した同じことをするエイリアスを共有したいだけです:

以下を〜/ .gitconfigに追加してください

[alias]
    delete-tag = "!f() { \
            echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
            git push --delete origin $1; \
            echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
            git tag -d $1; \
        }; f"

使用法は次のようになります。

-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.