git标签也被推送了吗?

由于我创build了我的仓库,看来我创build的标签不会被推送到仓库。 当我在本地目录上做git标签时,所有的标签都存在,但是当我login到远程仓库并且做一个git标签时,只有前几个出现。

问题是什么?

你可以这样做:

 git push --tags 

在默认的git远程configuration中,您必须显式地推送标签(当它们被自动提取时,它们指向的提交)。 你需要使用

 $ git push <remote> tag <tagname> 

推一个标签,或者

 $ git push <remote> --tags 

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

这是非常想要的行为,使推式标签明确。 推送标签通常应该是有意识的select。


总结Junio C. Hamano 写的 (@Andre Miras的评论)

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

  1. 那里存在的一组标签是所有发布者想要的人都可以看到的
  2. 不仅你,而且其他人也会看到相同的标签。

换句话说,您从中获取的存储库中的标签被devise为公共和共享。 如果每个人都很容易获取这些相同的标签,它将促进开发人员之间的沟通。

这就是为什么git fetch自动git fetch “跟随”标签,即下载标签时下载修改指向 – 换句话说下载所有相关的发布标签。

推送时,您正在从工作存储库中推送,大部分时间不是公开的,而存储库中的标签不是公开的。 您可以使用自己的本地标记来标记进度,因此盲目地将存储库中的所有标记推送到您要推送的存储库以发布您的更改是没有意义的,这些更改的定义根据定义是公开的。

这就是为什么您需要明确推送标签,以标记为公开。


或者,您可以configuration您推送到的远程总是推动所有的标签,例如在你的.git/config放置类似的东西:

 [远程“发布”]#或任何命名
     url = ...
     push = + refs / heads / *:refs / heads / *
     push = + refs / tags / *:refs / tags / *

这意味着强制推动所有头(所有分支)和所有标签(如果你不想强迫推头,从refspec删除'+'前缀)。

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

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

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

 git push --follow-tags 

这不会推送所有的本地标签,只有通过git push提交引用的注释引用。


这已经由Junio C gitstergitster )在c2aba15提交 :

新的选项“ --follow-tags ”告诉“ git push ”推送从另一端丢失的注释标签,并且可以通过推出的历史logging到达。

例如,如果您正在使用“ simple ”,“ current ”或“ upstream ”推送,则通常会推送导致您当前HEAD提交的历史logging,而不是其他任何内容。
使用这个选项,你也可以将所有可以从该提交到达的注释标签推送到另一侧。


configurationpush.followTag允许在默认情况下包含 – --follow-tags (Git 2.4.1+,Q2 2015)。
请参阅“ 同时推送git提交和标记 ”

我通常做的是:

 [远程“发布”]#或任何命名
     url = ...
     push =:
     push = + refs / tags / *:refs / tags / *

意思是推动已经存在的每一个分支,加上标签。 它不会强制推送,而且不会推送您没有手动推送的分支。

如果你想强制获取所有的标签,你可以通过下面的configuration来设置它:

 git config remote.origin.tagopt --tags 

从文档:

将此值设置为–no-tags将从远程访存时禁用自动标记跟踪。 将它设置为–tags将从远程获取每个标签,即使它们不能从远程分支机构到达。 将这些标志直接传递给git-fetch(1)可以覆盖这个设置。 请参阅git-fetch(1)的选项–tags和–no-tags。