如何删除已推送的Git标记?
答案 0 :(得分:4603)
您只需要将“空”引用推送到远程标记名称:
git push origin :tagname
或者,更明确地,使用--delete
选项(如果您的git版本早于1.8.0,则使用-d
):
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
省略源ref(冒号前的部分),将'nothing'推送到目的地,删除远端的ref。
答案 1 :(得分:314)
更简单的方法是
git push --delete origin YOUR_TAG_NAME
IMO前缀冒号语法在这种情况下有点奇怪
答案 2 :(得分:181)
如果要删除远程标记v0.1.0
,而远程标记为origin
,则只需:
git push origin :refs/tags/v0.1.0
如果您还需要在本地删除标记:
git tag -d v0.1.0
有关Git异常:
删除语法的说明,请参阅Adam Franco's answer。
答案 3 :(得分:97)
删除所有本地代码并获取远程代码列表:
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
答案 4 :(得分:28)
从远程存储库中删除标记:
git push --delete origin TAGNAME
您可能还想在本地删除标记:
git tag -d TAGNAME
答案 5 :(得分:22)
在终端上执行此操作:
git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
现在去Github.com刷新,它们就消失了。
答案 6 :(得分:14)
请注意,如果您有一个名为远程标记的远程分支,则这些命令不明确:
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>'
答案 7 :(得分:11)
git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
答案 8 :(得分:9)
如果您在Git存储库中创建了一个名为release01
的标记,则可以通过执行以下操作将其从存储库中删除:
git tag -d release01
git push origin :refs/tags/release01
从Mercurial存储库中删除一个:
hg tag --remove featurefoo
请参考https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
答案 9 :(得分:7)
在需要删除11,000多个标签后阅读这些答案后,我了解了这些方法依赖或xargs
花了太长时间,除非你有几个小时的刻录。
苦苦挣扎,我找到了两个很多更快的方法。对于两者,请从git tag
或git ls-remote --tags
开始,以制作要在遥控器上删除的标记列表。在下面的示例中,您可以使用任何sorting_proccessing_etc
,grep
,sort
或tail
或head
来省略或替换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
更快,并且在一个方法中使用至少几个千标签时间。:
这是如何工作的?
正常的,以行分隔的标记列表将转换为一行以空格分隔的标记,每个标记前面都有tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
。 。
git push
使用带有此格式标记的local_ref_path:remote_ref_path
会将 nothing 推送到每个远程引用中,并将其删除(推送此方式的正常格式为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 " ")
或类似于远程删除:
public class PaymentService : IPaymentService<Payment>, IDisposable
答案 10 :(得分:6)
其他答案指出了如何实现这一目标,但你应该记住后果,因为这是一个远程存储库。
On Retagging部分中的git标签手册页有一个很好的解释,说明如何礼貌地通知远程回购的其他用户有关更改。他们甚至提供了一个方便的公告模板,用于沟通其他人应该如何做出改变。
答案 11 :(得分:5)
正如@CubanX建议的那样,我已经将这个答案从我的原文中删除了:
print
快几倍,并且可以通过调整进行更多扩展。它使用Github API,一个个人访问令牌,并利用实用程序parallel
。xargs
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\"`
参数以允许更快的操作,但我遇到了Github rate limits的问题,这些问题目前是5000 /小时,但似乎也没有未记录的短期限制好。
在此之后,您可能也想要删除本地标签。
这要快得多,所以我们可以回到使用--jobs 2
和xargs
,这已经足够了。
git tag -d
答案 12 :(得分:5)
我想删除除了那些匹配模式的标签以外的所有标签,这样我就可以删除除了过去几个月的生产标签之外的所有标签,这是我过去取得的巨大成功:
删除所有远程标记&amp;从删除中排除表达
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin
删除所有本地标记&amp;从删除中排除表达
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
答案 13 :(得分:4)
从本地和原始位置删除给定标记的简单脚本。 检查标签是否确实存在。
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)
答案 14 :(得分:4)
似乎已为xargs
已经做过的很多工作做了很多工作。回顾一下这个主题,我猜测你遇到的xargs
的缓慢是因为原来的答案是xargs -n 1
,当它真的不需要时。
除了xargs
自动处理最大命令行长度外,这相当于您的方法一:
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个参数。您可以尝试使用这些参数来找到最适合您需求的参数。
答案 15 :(得分:4)
如果您使用SourceTree(一个出色的Git GUI),则可以通过以下操作轻松地执行此操作而无需命令行:
您的TAG_NAME现在将从您的本地存储库和所有远程站点(包括GitHub,BitBucket或您列出为该存储库的远程站点的所有远程站点)中删除。
此外,如果您在本地删除了一个标签,但没有在远程起点上删除它,并且想在所有地方删除它,那么只需创建一个具有相同名称并与起点相同提交并附加在其上的新标签。然后,重复上述步骤以删除所有地方。
答案 16 :(得分:3)
如果您正在使用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 $_ }
答案 17 :(得分:3)
对于 tortoise git 用户,在数百个标签的规模下,您可以使用 UI 一次删除多个标签,但 UI 被很好地隐藏在上下文菜单下。
从资源管理器窗口右键单击 -> 浏览引用 -> 右键单击 ref/refmotes/name -> 选择 '删除远程标签'
见https://tortoisegit.org/docs/tortoisegit/tgit-dug-browse-ref.html
答案 18 :(得分: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
答案 19 :(得分:2)
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
第一行从本地存储库中删除your_tag_name
,第二行从远程存储库中删除它。现在,your_tag已从本地和远程回购中完全删除,但是有时您可能需要删除由GitHub在发行版中手动起草的已删除标签。
答案 20 :(得分:2)
如果您的标签是以#字符开头创建的,例如#ST002
,您可能会发现无法使用普通模式删除。即。
git tag -d #STOO2
不会删除标记,而是将其包装在字符串文字中,如此
git tag -d "#ST002" or git tag -d '#ST002'
这会将其删除。希望它能帮助那些犯了使用#错误编写标签名称的人。
答案 21 :(得分:2)
git push --delete origin $TAGNAME
是正确的方法(除了本地删除)。
但是:请确保使用 Git 2.31。
"git push $there --delete
"(man) 应该被诊断为错误,但却变成了匹配的推送,这已在 Git 2.31(2021 年第一季度)中得到纠正).
请参阅 commit 20e4164 的 Junio C Hamano (gitster
)(2021 年 2 月 23 日)。
(2021 年 2 月 25 日在 Junio C Hamano -- gitster
-- 被 commit 1400458 合并)
push
: 不要将 --delete '' 变成匹配的推送关注者:Tilman Vogel
<块引用>当我们添加语法糖“git push remote --delete
”(man) <ref>
到“git push
”({{3 }}) 作为规范 man(git push remote
) 的同义词:man 处的语法 ("builtin-push
: {{ 3}}(f517f1f) --delete
作为 :foo" 的语法糖,2009-12-30,Git v1.7.0-rc0 -- add
) ,我们没有足够小心以确保 <ref>
不为空。
盲目地将 "--delete " 重写为 ":" 意味着空字符串 <ref>
会导致 refspec ":",这是要求不删除任何内容的“匹配”推送的语法。>
更糟糕的是,如果有可以快进的匹配引用,它们就会过早发布,即使用户觉得它们还没有准备好被推出,这将是一场真正的灾难。
>答案 22 :(得分:0)
您好,我只是想分享一个我创建的别名,该别名具有相同的作用:
将以下内容添加到您的〜/ .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)
答案 23 :(得分:0)
要删除远程存储库中的标签,可以使用
git push <remote> :refs/tags/<tagname>
解释上述内容的方法是将其读取为空值,即将冒号推送到远程标记名之前的值。
答案 24 :(得分:-1)
这对我有用
git push --force origin refs/tags/<tag_name>:refs/tags/<tag_name>