git标签也会被推送吗?


188

自从我创建存储库以来,似乎一直在创建的标签未推送到存储库。当我git tag在本地目录上执行操作时,所有标记都存在,但是当我登录到远程存储库并执行时git tag,只会显示前几个。

这可能是什么问题?


3
git push --follow-tags现在可以使用,请参阅下面的答案
VonC


1
同意重复:尽管年龄较大,但另一个问题更好。
Ciro Santilli郝海东冠状病六四事件法轮功

Answers:


244

您可以这样做:

git push --tags

27
我很确定这意味着HEAD ref不会被推送,这意味着您只能推送标签。
Dan Rosenstark 2012年

47
“我建议您不要使用或培训其他人使用,git push --tags因为当您的同事受过推销所有标签的训练时,要摆脱掉不良标签非常困难,因为人们每次每次都会在本地推销他们所拥有的旧的不良标签想要推一个新标签。因此,我只会建议每个人git push origin <tag_name>现在使用。” -从stackoverflow.com/a/5195913/4130619
减少

我认为应该接受另一个答案stackoverflow.com/a/16164809/11635。即使不是,也应该绝对阅读它-它提供了优点和缺点,并最终为今天提供了一个更实际,更正确的答案
Ruben Bartelink 18/12/23

139

在默认的git remote配置中,您必须显式推送标签(标签会自动与指向的提交一起获取)。您需要使用

$ git push <remote> tag <tagname>

推一个标签,或者

$ git push <remote> --tags

推送所有标签(或git push --tags通常推送到默认远程origin)。

这是非常有意的行为,用于使推送标签明确。推送标签通常应该是有意识的选择。


总结Junio C. Hamano 撰写的内容(在@Andre Miras的评论中链接)

提取时,您正在与有人发布的远程存储库进行交互,这意味着:

  1. 存在的一组标记,所有发布者都希望人们看到,
  2. 不仅您,其他人也会看到相同的标签。

换句话说,您从中获取的存储库中的标签被设计为公开和共享的。如果每个人都容易获取这些相同的标签,它将有助于开发人员之间的通信。

这就是为什么git fetch自动“跟随”标签的原因,即在下载它们指向的修订版本时会下载标签-换句话说,会下载所有相关的已发布标签。

推送时,您是从工作存储库中推送,该存储库在大多数情况下不是公开的,并且该存储库中的标签并非设计为公开的。您可以使用自己的本地标记来标记您的进度,因此盲目将存储库中的所有标记推送到要发布更改的存储库中是没有意义的,这些标记的定义是公开的。

这就是为什么您需要显式推送标记,以将标记标记为公共。


另外,您可以配置要推送的遥控器以始终推送所有标签,例如,在您的服务器中放置类似的标签.git/config

[远程“发布”]#或其他名称
    网址= ...
    推送= + refs / heads / *:refs / heads / *
    推送= + refs / tags / *:refs / tags / *

这意味着强行推入所有头部(所有分支)和所有标签(如果您不想强行推入头部,请从refspec中删除“ +”前缀)。


难道这不是总在全力以赴吗?
StefanNäwe2010年

@Stefan:是的。更新。
JakubNarębski2010年

19
“这是非常有意的行为,用来使推式标签明确。推式标签通常应该是有意识的选择。” 我不明白这个理由。您能否详细说明为什么Git自动推送标签会很糟糕?
Ryan Lundy

13
@Kyralessa在git.661346.n2.nabble.com/…中,Junio C Hamano(Git的当前维护者)解释了为什么自动推送标签是一件不好的事情。
Andre Miras 2013年

@AndreMiras感谢您提供的出色链接。如果我们可以将Junio的帖子整合到此答案中,那将是很好的。
Homer6

67

请注意,自git 1.8.3(2013年4月22日)以来,您不再需要执行2条命令来推送分支,然后再推送标签:

新的“ --follow-tags选项告诉” git push当推出分支时推送相关的带注释的标签

现在,当推送新提交时,您可以尝试:

git push --follow-tags

但是,这不会推送所有本地标签,而只会推送由提交引用的带注释的标签,并由推送git push


这已被引入提交c2aba15通过JUNIOÇ滨野(gitster

新的选项“ --follow-tags”告诉“ git push”推送从另一面丢失的注释标签,而这些注释可以通过被压出的历史记录来访问。

例如,如果您使用“ simple”,“ current”或“ upstream”推送,则通常会按当前推送推送导致提交的历史记录HEAD
使用此选项,您还将把可以从该提交到达的所有带注释的标签推到另一侧。


该配置默认push.followTags允许包含--follow-tags(Git 2.4.1+,Q2 2015)。请参阅“ 同时推送git commits和标签


3
这只会推送所有带注释的标签。大多数人/项目都在使用轻量级标签。因此,在大多数情况下git push --follow-tags,推动git push
力度

3
@Jarl是的,我在回答中提到了“带注释”。但是我实际上只使用了带注释的标签,只为内部使用保留了轻量级标签(即,无论如何也绝不打算被推送)。
VonC

@VonC:现在还有一个配置选项将其设为默认值,如您在此处所述:stackoverflow.com/a/3745250/946850
krlmlr 2015年

19

我通常要做的是:

[远程“发布”]#或其他名称
    网址= ...
    推=:
    推送= + refs / tags / *:refs / tags / *

这意味着它将推送已经存在的每个分支以及标签。它不会强制推送,也不会推送您未手动推送的分支。


我还可以将其放在用户的全局git配置中吗?如果是,怎么办?谢谢!:)
gucki

看起来您在强制标记,而不是分支。
Adrian Ratnapala

是的,是的,不是,我写道,它将推送新标签,不会强制推送它们,也不会推送尚未推送自己的分支。

我尝试了雅库布(Jakub)的建议,但它在推动只在本地需要的分支。这个建议,行之有效。它同步标签,但不同步分支,除非它们是远程跟踪分支(即,它不会将新分支推送到远程,但如果它们已经在远程中,则将更新它们)。注意:如果您有一个标签和一个同名的分支,则会出现“匹配多个”错误。请参阅lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/
josephdpurcell

5

如果要强制获取所有标签,则可以通过以下方式在配置中进行设置:

git config remote.origin.tagopt --tags

从文档:

从remote获取时,将此值设置为--no-tags将禁用自动标记跟随。将其设置为--tags将从remote获取每个标签,即使无法从远程分支头访问它们也是如此。将这些标志直接传递到git-fetch(1)可以覆盖此设置。请参阅git-fetch(1)的选项--tags和--no-tags。


1
这个问题更偏向于“推送”,在推向遥控器时您的答案也适用吗?
a1an
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.