如何删除已推送的Git标记?
当前回答
我想删除所有标签,除了那些与模式匹配的标签,这样我就可以删除除最后几个月的生产标签之外的所有标签,这是我取得巨大成功的原因:
删除所有远程标记并从删除中排除表达式
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
其他回答
这对我有用
git push --force origin refs/tags/<tag_name>:refs/tags/<tag_name>
这里有一个本地测试用例,可以在本地测试而不干扰远程设备:
~/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
您可以将“空”引用推送到远程标记名:
git push origin :tagname
或者,更明确地说,使用--delete选项(如果git版本早于1.8.0,则使用-d):
git push --delete origin tagname
注意,git具有标记名称空间和分支名称空间,因此您可以对分支和标记使用相同的名称。如果要确保不会意外删除分支而不是标记,可以指定full ref,该ref将永远不会删除分支:
git push origin :refs/tags/tagname
如果还需要删除本地标记,请使用:
git tag --delete tagname
出身背景
将分支、标记或其他引用推送到远程存储库涉及指定“哪个repo、哪个源、哪个目标?”
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。
删除本地标记“12345”
git tag -d 12345
删除远程标记“12345”(例如,GitHub版本也是)
git push origin :refs/tags/12345
替代方法
git push --delete origin tagName
git tag -d tagName
似乎xargs已经做了很多工作。回顾这篇文章,我猜你所经历的xargs的缓慢是因为最初的答案使用了xargs-n 1,而实际上并不需要。
除了xargs自动处理最大命令行长度之外,这与方法1等效:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs也可以并行运行进程。使用xargs的方法2:
git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin
上面最多使用5个进程来处理每个进程中最多100个参数。你可以尝试这些论点,以找到最适合你的需求的东西。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别