如何使用refspec将Git标签推入分支?


216

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

我现在正在执行以下操作:

git push production +1.0.0:master

我要强制执行推送,因为我所关心的只是将1.0.0标记内的代码推送到master远程存储库上的分支。

我究竟做错了什么?

更新#1

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

更新#2

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

git push production 1.0.0:master

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

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


您能否阐明“无效”的含义?Git会给出特定的错误,还是会产生无效效果?
vcsjones

对不起。是的,因此基本上,当我通过SSH进入服务器,进入git存储库并运行git branch -l列出分支时,我只会看到其他分支。但是,git push production +1.0.0:master确实进行了推送,当我重新推送时显示“ Everything-to-date”,但是我看不到远程服务器上的master分支。
Michael van Rooijen

5
您应该更改接受的答案。第二个答案比标记为已接受的答案简单得多。
Pedro Rolo 2012年

回复晚了非常抱歉。我同意,现在已经更改了接受的答案。
Michael van Rooijen

1
@MichaelvanRooijen我不明白您选择的已接受答案实际上是如何解决此问题的。它不会用标签覆盖分支,而只是将标签推送到远程。

Answers:


61

它可能是失败的,因为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)中的指定修订版本”中进行了描述


1
这样就解决了问题!但是master分支需要已经存在。但是,这不是我的问题。非常感谢你的帮助!
Michael van Rooijen

2
@迈克尔:啊。是的,如果master不存在(作为分支或标签),git push rep +tag:master则将创建一个名为master而不是分支的标签。git push rep +tag~0:master(同样,当master不作为分支或标记存在时)将失败,并显示“错误:无法推送到不合格的目的地”。(在存在任何分支/标记之前)可以完成所需操作的命令是git push rep +tag~0:refs/heads/masterrefs/heads/是存储分支的名称空间)。
克里斯·约翰森

大!那将帮助我出奇地好。很方便!非常感谢您发布该信息。
Michael van Rooijen 2010年

4
@brad:~{commit}语法是文字的(即始终是这九个字符);这个词commit在这里不是占位符。
克里斯·约翰森

1
喔好吧!抱歉,我以为您打算输入特定的提交,现在更有意义了。
布拉德(Brad)

469
git push --tags production

4
如果该标签已存在于遥控器上,则需要首先使用删除该远程标签git push production :1.0.0
尊重TheCode 2013年

1
如果在任何情况下您都具有相同名称的分支:“ 1.0.0”,则此推送将失败,因此更好地使用:git push production :refs/tags/1.0.0仅删除标签
Vladimir

1
@Nerian:我认为它只是推送标签
bstpierre

5
这实际上如何解决原始张贴者的问题,即通过强行按下来覆盖带有标签的分支?这只是将您所有的标签推送到远程,不会覆盖任何分支。

1
这不是问如何推一个标签的问题吗?该命令的作用远不止于此。
克里斯·马丁

61

我像这样创建标签,然后将其推送到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
它会推送您所有的标签
Dawid Drozd

2
请注意,这实际上并不能解决原始海报有关用标签覆盖分支的问题,它只会将标签推到远程位置,而不会影响分支。

10

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

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

如果要在master分支中包含标签的内容,请在计算机上本地进行。我假设您继续在本地master分支中进行开发。然后只要一个git push origin master就足够了。


5
请注意,这实际上并不能解决原始海报有关用标签覆盖分支的问题,它只会将标签推到远程位置,而不会影响分支。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.