【问题标题】:How do you push a Git tag to a branch using a refspec?如何使用 refspec 将 Git 标签推送到分支?
【发布时间】:2011-05-02 23:12:41
【问题描述】:

我想强制推送,例如,我的标签 1.0.0 到我的远程 master 分支。

我现在正在做以下事情:

git push production +1.0.0:master

我要强制推送,因为我只关心1.0.0标签内的代码被推送到远程的master分支存储库。

我做错了什么?

更新 #1

当我通过 SSH 连接到我的 Git 存储库所在的服务器并执行 git branch -l 时,我也没有看到 master 分支。

更新 #2

从远程 Git 存储库中运行 git tag -l 后,我看到 master 已列出,这意味着当我运行以下内容时:

git push production 1.0.0:master

它实际上推送了标签并创建了一个名为master的标签,而不是一个新的分支

我想基本上将标签1.0.0内容推送到远程Git存储库的master分支中。

【问题讨论】:

  • 你能解释一下“不工作”是什么意思吗? Git 会给出特定的错误,还是会产生 null 效果?
  • 对不起。是的,所以基本上当我 SSH 进入我的服务器、进入 git 存储库并运行 git branch -l 以列出分支时,我只看到我的另一个分支。但是,git push production +1.0.0:master 确实推送了,当我重新推送时,它说 Everything up-to-date,但我没有看到远程服务器上的 master 分支。
  • 您应该更改接受的答案。第二个答案比标记为接受的答案简单得多。
  • 抱歉回复晚了。我同意并且现在更改了接受的答案。
  • @MichaelvanRooijen 我不明白the accepted answer that you chose 究竟是如何解决这个问题的。它不会用标签覆盖分支,它只是将您的标签推送到远程。

标签: git git-push git-tag


【解决方案1】:
git push --tags production

【讨论】:

  • 如果远程标签已经存在,您需要先用git push production :1.0.0删除远程标签。
  • 如果在任何情况下您将拥有同名的分支:'1.0.0',此推送将失败,因此更好地使用:git push production :refs/tags/1.0.0 仅删除标签
  • @Nerian:我认为它只是推送标签
  • 这实际上如何解决原始发布者关于通过强制推送标签覆盖分支的问题?这只是将所有标签推送到远程,它不会覆盖任何分支。
  • 问题不是在问如何推送 one 标签吗?这个命令的作用远不止于此。
【解决方案2】:

它可能失败了,因为1.0.0 是一个带注释的标签。也许你看到了以下错误信息:

错误:试图将非提交对象写入分支 refs/heads/master

带注释的标签有自己独特的对象类型,指向带标签的提交对象。分支不能有用地指向标记对象,只能提交对象。您需要“剥离”带注释的标签以提交对象并推送它。

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

在这种情况下还有另一种语法也可以使用,但是如果标记对象指向的不是提交(或指向的标记对象(指向...的标记对象),则它的含义会略有不同。提交)。

git push production +1.0.0^{}:master

这些标签剥离语法在git-rev-parse(1) 中的Specifying Revisions 中进行了描述。

【讨论】:

  • 这解决了问题!但是 master 分支需要已经存在。然而,这对我来说不是问题。非常感谢您的帮助!
  • @Michael:啊。是的,如果 master 不存在(作为分支或标签),那么git push rep +tag:master 将创建一个名为 master 的标签而不是分支。 git push rep +tag~0:master(同样,当 master 不作为分支或标记存在时)将失败并显示“错误:无法推送到不合格的目的地”。可以完成您想要的操作的命令(在任何 master 分支/标记存在之前)是 git push rep +tag~0:refs/heads/masterrefs/heads/ 是存储分支的命名空间)。
  • 太棒了!这将极大地帮助我。很方便!也非常感谢您发布这些信息。
  • @brad:~{commit} 语法是字面的(即总是这九个字符); commit 这个词在这里不是占位符。
  • 啊好吧!抱歉,我以为您打算进行特定的提交,现在更有意义了。
【解决方案3】:

我这样创建标签,然后将其推送到 GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

【讨论】:

  • 它会推送你所有的标签
  • 请注意,这实际上并不能解决原始发布者关于用标签覆盖分支的问题,它只会将您的标签推送到远程,而不会影响分支。
【解决方案4】:

对于推送单个标签:git push <reponame> <tagname>

例如,git push production 1.0.0。标签不绑定到分支,它们绑定到提交。

如果您想在 master 分支中拥有标记的内容,请在您的机器上本地执行此操作。我假设您继续在本地主分支中进行开发。那么只需一个git push origin master 就足够了。

【讨论】:

  • 请注意,这实际上并不能解决原始发布者关于用标签覆盖分支的问题,它只会将您的标签推送到远程,而不会影响分支。
猜你喜欢
  • 2017-07-12
  • 2010-11-07
  • 2018-12-22
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多