我知道,git push --tags是一个单独的操作,以平原老git push的原因。推标签应该是一个有意识的选择,因为你不想意外地推一个。没关系。但是有没有一种方法可以将两者结合起来呢?(除git push && git push --tags外)
- 你对git push && git push --tags有什么问题?
- 没有什么特别的,只是因为连接必须建立两次,所以速度变慢了。
- 请参阅下面我更新的答案:自Git 1.8.3以来,有一个新的--follow-tags选项。
- 另一个不单独进行这些操作的原因是,当您有了这种自动化时,避免为同一提交触发两个CI构建。
2015年5月更新
从Git 2.4.1开始,您可以
1
| git config --global push.followTags true |
If set to true enable --follow-tags option by default. You may override this configuration at time of push by specifying --no-follow-tags.
号2013年4月更新
自Git 1.8.3(2013年4月22日)以来,您不再需要执行两个命令来推送分支,然后再推送标签:
The new"--follow-tags" option tells"git push" to push relevant annotated tags when pushing branches out.
号
现在,您可以在推送新提交时尝试:
号
但是,这不会推送所有的本地标签,只会推送提交引用的那个标签,这个标签是用git push推送的。
Git 2.4.1+(2015年第2季度)将引入选项push.followTags:请参见"如何使"git push包括分支内的标签?".
原始答案,2010年9月
核选择将是git push --mirror,这将推动refs/下的所有参考。
您还可以使用当前的分支提交只推送一个标记:
1
| git push origin : v1.0.0 |
您可以将--tags选项与refspec结合起来,例如:
1
| git push origin --tags : |
。
(由于--tags表示:除命令行明确列出的refspec外,refs/tags下的所有refs都被推送)
您还拥有这个条目"通过单个"git push"调用推送分支和标记"
A handy tip was just posted to the Git mailing list by Zoltán Füzesi:
I use .git/config to solve this:
号
1 2 3 4 5
| [remote"origin"]
url = ...
fetch = +refs/heads/*:refs/remotes/origin/*
push = +refs/heads/*
push = +refs/tags/* |
With these lines added git push origin will upload all your branches and tags. If you want to upload only some of them, you can enumerate them.
Haven't tried it myself yet, but it looks like it might be useful until some other way of pushing branches and tags at the same time is added to git push.
On the other hand, I don't mind typing:
号
1
| $ git push && git push --tags |
。
当心,正如Aseem Kishore所说
push = +refs/heads/*将迫使你的所有分支。
This bit me just now, so FYI.
号
Ren_Scheibe添加了以下有趣的评论:
The --follow-tags parameter is misleading as only tags under .git/refs/tags are considered.
If git gc is run, tags are moved from .git/refs/tags to .git/packed-refs. Afterwards git push --follow-tags ... does not work as expected anymore.
号
- 谢谢你的详细回答。恐怕江户十一〔0〕对我不起作用,但江户一〔1〕起作用了。不确定这是我的配置问题还是你的错别字。
- @威尔:更像是我这边的打字错误。我已经把它写在我的答案里了。
- 你链接到的帖子上的一条评论正确地指出,push = +refs/heads/*线力推动你的所有分支。刚才这咬了我,所以,仅供参考。
- 回复:在git 1.8.3中添加了--follow-tags标志,我可以配置git安装使其成为默认设置吗?
- @Trevorburnham否,只有push.default的值(git scm.com/docs/git config)可以定义推送时的默认操作(nothing、matching、upstream、simple,如stackoverflow.com/a/10002469/6309中所示。您需要明确添加--follow-tag。
- @VONC如果我想强制推标签怎么办?git push --follow-tags -f不适合我。
- @用户640378,我不知道。我会先强制推一个标签,然后再做一个经典的git push --follow-tags。
- 我希望--follow-tags也能为轻量级标签工作。
- @当涉及到标签(git scm.com/book/en/git basics tagging creating tags)时,我怀疑这是为了推动带注释的标签,而不是轻量级的标签。
- 需要注意的是,如果您在Git配置中设置了push.default=simple,那么git push --follow-tags将不起作用。在这种情况下,您仍然需要使用git push && git push --tags。
- @奇怪的是…你可以在那里找到脚本(比如github.com/davidheryanto/etc/blob/master/git.txt),它将push.default设置为simple和push --follow-tags。您正在推送的(单个)分支上的标签应该考虑在内。
- @我的一个同事刚刚遇到了这个问题。只有将push.default设置为matching后,才能使用git push --follow-tags。在那之前它不起作用。他的Git版本是1.8.5.2。
- @另外,看看最近的Git2.1+版本是否会持续下去,这会很有趣。
- @Trevorburnham您总是可以在.profile或.bash_profile中创建别名快捷方式。alias gpush='git push --follow-tags'或alias gpush='git push && git push --tags'允许您在命令行运行gpush,以触发您想要的任何口味。
- --follow-tags不适用于Git2.1.0。我有push.default=simple,这是默认值。
- @或者你有错误信息吗?因为该选项仍在新发布的git 2.3.5中(github.com/git/git/blob/…)
- @VONC无错误,只是正常推送
- @如果标签已经被推了,它就不会再推了。
- @他们不是。典型的场景是,我创建一个commit,标记它,我执行git push --follow-tags。提交被推送,标记不被推送。
- @那么,您的标签不是带注释的标签,而是一个轻量级的标签。如果它被注释,它也会被推送。
- 让我们在聊天中继续讨论。
- 如果不想在默认情况下强制推,请删除"+"。(提示:除非您的远程存储库真的应该镜像您所做的一切,否则您不会。)
- 我能和git pull做同样的事情吗?
- @zx1986是的,因为git 1.9.0:stackoverflow.com/a/27716902/6309
- [远程"来源"]url只能指定一个存储库?它能为所有存储库服务吗?@ Vonc
- @netawater请参阅stackoverflow.com/a/12795747/6309,了解每个远程服务器的多个URL。
- @vonc只跳过url属性,获取和推送标记都可以。
- 为什么不使用默认标签?是否有任何情况需要强制更改而不是标记?
- @是的,默认情况下,Git不会假定您想要推送标签:您可能错误地生成了数百个标签,或者只生成了一个用于Internel的标签。但是,使用git config --global push.followTags true,您可以将其作为您的回购的默认值。
- @VONC:这些案件似乎都是人为造成的。我认为对于大多数用户来说,最小惊喜的价格意味着标签应该在默认情况下推送。
- @我同意。我怀疑这主要是出于历史原因。同样,现在,全局设置允许您将其永久化,但这还不是默认设置。
- 由于只考虑.git/refs/tags下的标记,因此--follow-tags参数是误导性的。如果运行git gc,标签将从.git/refs/tags移动到.git/packed-refs。之后,git push --follow-tags ...不再按预期工作。
- @Ren&233;Scheibe有趣。我已经把你的评论包括在回答中,以提高可见度。
也许这对某人有帮助:
1 2 3
| 1. git commit -a -m"msg"
2. git tag 0.1.0 // creates a new tag locally
3. git push origin tag 0.1.0 // pushes the tag & the code in the remote repo |
。
- 我用git-2.21.0.windows.1尝试了你的解决方案,发现3只会推标签
- 它在我这边工作得很好。您正在按正确的顺序尝试所有3个命令,并且设置了远程报告(git remote-v)?
- 我在步骤1中使用了"git commit-m"msg,但没有-a参数。这可能就是原因。感谢您的跟进!