自从我创建了我的仓库以来,似乎我创建的标签没有被推送到仓库。当我在本地目录中执行git tag
命令时,所有标签都存在,但是当我登录到远程仓库并执行git tag
命令时,只有前几个标签出现。
可能的问题是什么?
git push --tags
git push --tags
,因为当你的同事被训练成推送所有标签时,要摆脱错误的标签可能非常困难,因为每次想要推送新标签时,人们会继续推送其本地的旧标签。因此,我现在只会建议某人使用 git push origin <tag_name>
。 - reducing activity在默认的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"] # 或其他命名 url = ... push = +refs/heads/*:refs/heads/* push = +refs/tags/*:refs/tags/*
这意味着强制推送所有头(所有分支)和所有标签(如果您不想强制推送头,请从refspec中删除“+”前缀)。
请注意,自git 1.8.3(2013年4月22日)以来,您不再需要执行两个命令来推送分支和标签:
新的"
--follow-tags
"选项告诉"git push
"在推出分支时同时推出相关的已注释标签。
现在,在推送新提交时,您可以尝试使用该选项:
git push --follow-tags
这样做并不能推送所有本地标签,只有与使用git push
推送的提交引用的已注释标签才会被推送。
gitster
)在commit c2aba15中引入的新功能:--follow-tags
”告诉“git push
”推送缺失的已注释标签,如果它们可以通过推送出的历史记录到达。例如,如果您使用“simple
”,“current
”或“upstream
”推送,则通常只会推送导致当前HEAD
提交的历史记录,而不会推送其他内容。但是,使用此选项,您还将推送可以从该提交到达的所有已注释标签到另一侧。
push.followTags
可以默认包含--follow-tags
(Git 2.4.1+,2015年第二季度)。请参见“同时推送git提交和标签”。git push--follow-tags
不会比git push
更多地推送。 - Jarl我通常做的是:
[remote "publish"] # 或任何其他名称 url = ... push = : push = +refs/tags/*:refs/tags/*
这意味着它会推送已经存在的每个分支,以及标签。它不会强制推送,并且不会推送您没有手动推送的分支。
如果你想强制获取所有标签,你可以在配置中设置:
git config remote.origin.tagopt --tags
文档中的描述:
将该值设置为--no-tags时,在从远程获取内容时禁用自动标签跟随。将其设置为--tags将从远程获取所有标签,即使它们无法从远程分支头访问。直接将这些标志传递给git-fetch(1)可以覆盖此设置。请参阅git-fetch(1)的选项--tags和--no-tags。
git push --follow-tags
,请参见我下面的回答。 - VonC