すでにプッシュされているGitタグをどのように削除しますか?
すでにプッシュされているGitタグをどのように削除しますか?
回答:
リモートタグ名への「空の」参照をプッシュする必要があるだけです。
git push origin :tagname
または、より明確に、--delete
オプションを使用します(または-d
gitバージョンが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
ソース参照(コロンの前の部分)を省略すると、宛先に「何もない」がプッシュされ、リモートエンドの参照が削除されます。
git push --delete origin tag1 tag2
。ローカルタグの削除についてもgit tag -d tag1 tag2
tag
は単一のコミットにのみアタッチされます。そのため、ブランチ名は無関係です。
git tag -d `git tag`
すべてのローカルタグを削除することを知ることも興味深いです。git push --delete origin `git tag`
リモートタグをローカルにプルしたと仮定した場合も同様です。これはテスト環境では便利でした。
より簡単な方法は
git push --delete origin YOUR_TAG_NAME
この状況では、IMO接頭辞のコロン構文は少し奇妙です
git push --delete origin "TAGNAME"
、ここで、TAGNAMEは元のタグの名前です。
tag
、タグ名の前に単語を置いて、ブランチではなくタグを確実に取得できます。
refs/tags/
、次のようにタグの前にを付けることですrefs/tags/v2.3.1
。
v0.1.0
削除するリモートタグがあり、リモートがのorigin
場合は、次のようにします。
git push origin :refs/tags/v0.1.0
タグをローカルで削除する必要がある場合:
git tag -d v0.1.0
Gitの異常な削除構文の説明については、Adam Francoの回答を参照してください:
。
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
…?
:tagname
、リモート削除のために働く必要があります。
すべてのローカルタグを削除し、リモートタグのリストを取得します。
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
リモートリポジトリからタグを削除するには:
git push --delete origin TAGNAME
ローカルでタグを削除することもできます:
git tag -d TAGNAME
git push --delete origin TAGNAME && git tag -d TAGNAME
git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
リモートタグとして名前が付けられたリモートブランチがある場合、これらのコマンドがあいまいであることに注意してください。
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>'
11,000を超えるタグを削除する必要がある間にこれらの回答を読んだ後、これらの方法は信頼できるかxargs
、非常に長い時間がかかることを学びました。
苦労して、私は2つのはるかに速い方法を見つけました。どちらの場合も、git tag
またはで開始しgit ls-remote --tags
て、リモートで削除するタグのリストを作成します。以下の例ではsorting_proccessing_etc
、任意のgrep
ing、sort
ing、tail
ing、またはhead
ingを省略または置き換えることができます(例: grep -P "my_regex" | sort | head -n -200
など)。
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
)。
これらの両方の方法の後、おそらくローカルタグも削除する必要があります。私たちが使用して戻って行くことができるので、これははるかに高速であるxargs
とgit tag -d
、、これで十分です。
git tag | sorting_processing_etc | xargs -L 1 git tag -d
またはリモート削除と同様:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
優れたGit GUIであるSourceTreeを使用している場合は、次のようにすることで、コマンドラインなしでこれを簡単に実行できます。
YOUR_TAG_NAMEがローカルリポジトリとすべてのリモートから削除されます-GitHub、BitBucket、またはそのリポジトリのリモートとしてリストした他の場所に。
また、タグをローカルで削除したが、リモートオリジンでは削除せず、すべての場所で削除したい場合は、オリジンと同じコミットで同じ名前で添付される新しいタグを作成します。次に、上記の手順を繰り返して、すべての場所を削除します。
release01
Gitリポジトリーで呼び出されるタグを作成した場合は、次のようにしてリポジトリーから削除します。
git tag -d release01
git push origin :refs/tags/release01
Mercurialリポジトリから削除するには:
hg tag --remove featurefoo
https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551を参照してください
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 $_ }
@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ですが、文書化されていない短期的な制限もあるようです。
この後、おそらくローカルタグも削除する必要があります。これははるかに高速なので、xargs
andの使用に戻ることができますがgit tag -d
、これで十分です。
git tag | sorting_processing_etc | xargs -L 1 git tag -d
他の回答はこれを達成する方法を指摘していますが、これはリモートリポジトリであるため、結果に留意する必要があります。
On Retaggingセクションのgit tagのmanページには、リモートリポジトリの他のユーザーに変更を丁寧に通知する方法が詳しく説明されています。彼らは、他の人があなたの変更をどのように得るべきかを伝えるための便利な発表テンプレートさえ提供します。
パターンに一致するタグを除くすべてのタグを削除して、過去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
ローカルと元の場所の両方から特定のタグを削除する簡単なスクリプト。タグが実際に存在するかどうかを確認します。
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 tag_name)
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の引数を処理します。引数を試して、ニーズに最適なものを見つけることができます。
これは、リモートをいじらずにローカルでテストするローカルテストケースです。
~/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
こんにちは、私が作成した同じことをするエイリアスを共有したいだけです:
以下を〜/ .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)