git标签也被推送了吗?

vfc*_*sts 176 git git-tag

自从我创建了我的存储库后,看来我创建的标签没有被推送到存储库.当我git tag在本地目录上执行所有标记时,但是当我登录到远程存储库并执行操作时git tag,只显示前几个标记.

问题是什么?

eev*_*var 233

你可以这样做:

git push --tags
Run Code Online (Sandbox Code Playgroud)

  • "我建议不要使用或训练其他人使用`git push --tags`,因为当你的同事接受训练推动所有标签时,很难摆脱坏标签,因为人们继续推动旧的坏每次他们想要推送一个新标签时,他们都会在本地标记.因此,我只会建议有人立即使用`git push origin <tag_name>`. - 从http://stackoverflow.com/a/5195913/4130619复制 (43认同)
  • 我很确定这意味着HEAD引用不会被推送,这意味着你只能推动标签. (25认同)

Jak*_*ski 135

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

$ git push <remote> tag <tagname>
Run Code Online (Sandbox Code Playgroud)

推送单个标签,或

$ git push <remote> --tags
Run Code Online (Sandbox Code Playgroud)

推送所有标签(或git push --tags通常推送到默认遥控器origin).

这是非常有用的行为,可以使推送标签显式化.推送标签通常应该是有意识的选择.


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

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

  1. 那里存在的标签集是所有发布者都希望人们看到的,以及
  2. 不仅你,而且其他人也会看到相同的标签.

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

这就是为什么git fetch自动"跟随"标签,即在下载他们指向的修订版时下载标签 - 换句话说,下载所有相关的已发布标签.

按下时,你从你的工作仓库,其中大部分时间是不公开的推进,并在仓库标签的目的不是要公开.您可以使用自己的本地标签来标记你的进步,所以它没有任何意义盲目推动所有标签在你的资料库,以你是推到发布更改,其标签被定义公共资源库.

这就是为什么你需要明确地推送标签,将标签标记为公共标签.


或者,您可以配置您推送的遥控器以始终推送所有标签,例如在您的内容中添加类似的内容.git/config:

[remote "publish"] # or whatever it is named
    url = ...
    push = +refs/heads/*:refs/heads/*
    push = +refs/tags/*:refs/tags/*

这意味着强制推动所有头部(所有分支)和所有标签(如果您不想强制推动头部,请从refspec中删除'+'前缀).

  • "这是非常有意的行为,使推动标签明确.推动标签通常应该是有意识的选择." 我不明白其理由.你能详细说明为什么Git自动推送标签会有什么不好吗? (18认同)
  • @Kyralessa,在这篇文章http://git.661346.n2.nabble.com/rfd-auto-following-tags-upon-quot-git-push-quot-td6450398.html,Junio C Hamano(Git的现任维护者) )解释为什么自动推送标签是一件坏事. (13认同)

Von*_*onC 60

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

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

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

git push --follow-tags
Run Code Online (Sandbox Code Playgroud)

这不会推送所有本地标签,只有被提交引用的带注释的标签git push.


这是由Junio C Hamano (gitster)commit c2aba15中引入的:

新选项" --follow-tags"告诉" git push"推送另一侧缺少的注释标签,并且可以通过其他方式推出的历史记录到达.

例如,如果您使用" simple"," current"或" upstream"推送,则通常会将历史记录推送到您当前的提交HEAD而不是其他任何内容.
使用此选项,您还可以将可以从该提交到达的所有带注释的标记推送到另一侧.


配置push.followTags允许--follow-tags默认包含(Git 2.4.1 +,2015年第2季度).请参阅" 同时推送git提交和标记 "

  • 这只会推送所有*带注释的*标签.大多数人/项目使用*轻量级*标签.所以在大多数情况下`git push --follow-tags`并没有超过`git push` (3认同)
  • @Jarl是的,我在答案中提到了"注释".但我真的只使用了带注释的标签,为纯粹的内部使用保留了轻量级标签(即从来没有意味着要推送). (3认同)

mat*_*mat 19

我通常做的是:

[remote "publish"] # or whatever it is named
    url = ...
    push = :
    push = +refs/tags/*:refs/tags/*

这意味着它会推动已经存在的每个分支以及标记.它不会强制推动,并且它不会推动您没有手动推动的分支.


bor*_*ryn 5

如果你想强制获取所有标签,你可以通过以下方式在配置中设置它:

git config remote.origin.tagopt --tags
Run Code Online (Sandbox Code Playgroud)

从文档:

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