自从我创建了存储库以来,我创建的标签似乎没有推送到存储库。当我git tag
在本地目录上执行时,所有标签都存在,但是当我登录到远程存储库并执行时git tag
,只有前几个出现。
可能是什么问题?
你可以这样做:
git push --tags
在默认的 git 远程配置中,您必须显式推送标签(当它们与它们指向的提交一起自动获取时)。你需要使用
$ git push <remote> tag <tagname>
推送单个标签,或
$ git push <remote> --tags
推送所有标签(或git push --tags
推送到默认远程,通常origin
)。
这是非常有意的行为,以明确推送标签。推送标签通常应该是有意识的选择。
总结 Junio C. Hamano所写的内容(在@Andre Miras 的评论中链接)
获取时,您正在与某人发布的远程存储库进行交互,这意味着:
- 存在的标签集是发布者希望人们看到的所有标签,并且
- 不仅您,其他人也会看到相同的标签。
换句话说,您从中获取的存储库中的标签旨在公开和共享。如果每个人都可以轻松获取这些相同的标签,它将促进开发人员之间的沟通。
这就是为什么git fetch
自动“跟随”标签的原因,即它在下载它们指向的修订时下载标签 - 换句话说,下载所有相关的已发布标签。
推送时,您是从您的工作存储库中推送的,该存储库大部分时间是不公开的,并且该存储库中的标签并非设计为公开的。您可以使用自己的本地标签来标记您的进度,因此盲目地将存储库中的所有标签推送到您推送的存储库以发布您的更改是没有意义的,其标签根据定义是公共的。
这就是为什么您需要明确推送标签,将标签标记为公开。
或者,您可以将推送到的遥控器配置为始终推送所有标签,例如在您的.git/config
:
[remote "publish"] # 或任何名称 网址 = ... push = +refs/heads/*:refs/heads/* push = +refs/tags/*:refs/tags/*
这意味着强制推送所有头(所有分支)和所有标签(如果您不想强制推送头,请从 refspec 中删除“+”前缀)。
请注意,从git 1.8.3 (April 22d, 2013) 开始,您不再需要执行 2 个命令来推送分支,然后推送标签:
新的“
--follow-tags
”选项告诉“git push
”在推出分支时推送相关的注释标签。
您现在可以在推送新提交时尝试:
git push --follow-tags
不过,这不会推送所有本地标签,只会推送由git push
.
Junio C Hamano ( )在提交 c2aba15中介绍了这一点:gitster
新选项“
--follow-tags
”告诉“git push
”推送从另一侧丢失的注释标签,并且可以通过否则被推送的历史来访问。例如,如果您使用“
simple
”、“current
”或“upstream
”推送,您通常会推送导致当前提交的历史记录,HEAD
而不是其他任何内容。
使用此选项,您还将可以从该提交到达的所有带注释的标签推送到另一端。
该配置push.followTags
允许--follow-tags
默认包含(Git 2.4.1+,2015 年第二季度)。请参阅“同时推送 git 提交和标签”
我通常做的是:
[remote "publish"] # 或任何名称 网址 = ... 推=: push = +refs/tags/*:refs/tags/*
这意味着它会推送已经存在的每个分支以及标签。它不会强制推送,也不会推送您没有手动推送的分支。
如果你想强制获取所有标签,你可以通过以下方式在配置中设置它:
git config remote.origin.tagopt --tags
从文档:
将此值设置为 --no-tags 会在从远程获取时禁用自动标记跟踪。将其设置为 --tags 将从 remote 获取每个标签,即使它们无法从远程分支头访问。将这些标志直接传递给 git-fetch(1) 可以覆盖此设置。请参阅 git-fetch(1) 的选项 --tags 和 --no-tags。