自从我创建了我的存储库,它似乎标签我已经 创建不会推送到存储库。当我做git标签时 所有的标签都在本地目录,但当我登录到 远程存储库和做一个git标签,只有前几个显示。
会有什么问题呢?
自从我创建了我的存储库,它似乎标签我已经 创建不会推送到存储库。当我做git标签时 所有的标签都在本地目录,但当我登录到 远程存储库和做一个git标签,只有前几个显示。
会有什么问题呢?
在默认的git远程配置中,你必须显式地推送标记(当它们与它们所指向的提交一起自动获取时)。你需要使用
$ git push <remote> tag <tagname>
推送单个标签,或者
$ git push <remote> --tags
将所有标签(或git push——tags推到默认的远程,通常是origin)。
这是非常有意的行为,使推标签显式。推送标签通常应该是有意识的选择。
总结Junio C. Hamano的文章(链接在@Andre Miras的评论中)
当取回时,你正在与某人发布的远程存储库交互,这意味着: 存在于那里的标签集是发布者希望人们看到的所有标签,并且 不仅你,其他人也会看到相同的标签。 换句话说,您从中获取的存储库中的标记被设计为公共和共享的。如果每个人都能很容易地获取这些相同的标签,这将促进开发人员之间的交流。
这就是为什么git会自动获取“跟随”标签的原因,也就是说,它会在下载标签指向的修订时下载标签——换句话说,下载所有相关的已发布标签。
推送时,您是从正在工作的存储库进行推送,大多数情况下,存储库不是公共的,而且该存储库中的标记也不是设计为公共的。您可以使用自己的本地标记来标记您的进度,因此盲目地将存储库中的所有标记推到要发布更改的存储库中是没有意义的,因为根据定义,存储库的标记是公共的。
这就是为什么你需要显式地推送标签,把标签标记为公共。
或者,你可以配置你推送的远程总是推送所有标签,例如,在你的.git/config中放一些类似的东西:
[remote "publish"] # or whatever it is named url = ... push = +refs/heads/*:refs/heads/* push = +refs/tags/*:refs/tags/*
这意味着强制推所有头部(所有分支)和所有标签(如果你不想强制推头部,从refspec中删除'+'前缀)。
如果你想强制获取所有的标签,你可以在配置中设置:
git config remote.origin.tagopt --tags
从文档中可以看出:
将该值设置为——no-tags将禁用从远程获取时自动跟随标记。将它设置为——tags将获取每个标签 从远程,即使他们无法从远程分支到达 正面。将这些标志直接传递给git-fetch(1)可以覆盖这个 设置。参见git-fetch(1)的选项——tags和——no-tags。
我通常做的是:
[remote "publish"] # or whatever it is named url = ... push = : push = +refs/tags/*:refs/tags/*
这意味着它会推送每个已经存在的分支,加上标签。它不会强制推送,也不会推送非手动推送的分支。
注意,从git 1.8.3(2013年4月22日)开始,你不再需要执行2个命令来推送分支,然后再推送标签:
新的"——follow-tags"选项告诉"git push"在推出分支时推出相关的带注释的标签。
你现在可以尝试,当推送新的提交:
git push --follow-tags
不过,这不会推送所有的本地标记,只会推送git推送的提交中引用的带注释的标记。
这是由Junio C Hamano (gitster)在commit c2aba15中引入的:
新选项“——follow-tags”告诉“git push”推送从另一边丢失的带注释的标签,并且可以被推送的历史记录到达。 例如,如果您正在使用“simple”、“current”或“upstream”推,您通常会在当前HEAD处推送导致提交的历史记录,而不是其他内容。 使用此选项,您还可以将从该提交可以到达的所有带注释的标记推到另一侧。
配置推送。默认情况下,followTags允许包含——follow-tags (Git 2.4.1+, Q2 2015)。 参见“同时推送git提交和标记”