Answers:
您只需要将“空”引用推送到远程标记名称:
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
一个真实的示例,其中您将master分支推到原点的master分支是:
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 fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
现在去Github.com刷新,它们消失了。
请注意,如果您有一个名为remote tag的远程分支,则这些命令是不明确的:
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
花费太长时间的,除非您需要花费数小时。
挣扎,我发现了两个多更快的方法。对于这两种方式,都以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
etc):
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
与该format标记一起使用不会将任何内容推入每个远程引用,而将其删除(这种方式的常规格式是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 " ")
如果您使用SourceTree(一个出色的Git GUI),则可以通过以下操作轻松地在没有命令行的情况下执行此操作:
现在,您的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
正如@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
和git tag -d
,这已经足够了。
git tag | sorting_processing_etc | xargs -L 1 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
自动处理最大命令行长度:
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)