7

无论如何都必须在远程存储库中添加标签,而无需在本地克隆/添加它。我只需要这样做来标记 QA 版本

4

2 回答 2

16

您可以创建一个完全没有本地标签的远程标签

git push origin HEAD:refs/tags/foo

您可以删除相同的标签

git push origin :refs/tags/foo

这是一个解释。

接受命令git push。不太严格,一般语法可以解释为

git push where what:onto

where是您要推送到的远程存储库的名称。

what对本地存储库提交的引用(使用 git 提供的几种类型中的一种)。它可以是 SHA1、分支名称、标签名称或其他。

onto在您希望遥控器用来引用您正在推送的东西的名称中。

例如

git push origin master:master

正在推送指向origin的提交(以及所有其他先前的提交,如果远程没有它们)master,要求远程存储库调用它master,即在其master分支中保存与本地分支中记录的完全相同的 SHA1 master(这不完全正确,但接受这个例子来理解原理)。

现在,事实上,分支和标签只是存储SHA1提交的普通文件。您可以将它们视为排序指针变量,并引用存储库中的某些提交。分支和标签存储在.git/refs/heads.git/refs/tags

尝试

cat .git/refs/heads/master

所以,前面可以写成

git push origin refs/heads/master:refs/heads/master

如果您想foo在远程存储库中创建一个标签,指向您的master分支引用的同一提交,您可以运行

git push origin master:refs/tags/foo

如果您想在远程存储库上创建一个标签,引用您当前所在的完全相同的提交,请使用特殊的分支HEAD,它是指向您当前位置的指针

例如,尝试使用

git checkout master
cat .git/refs/heads/master
cat .git/HEAD

它应该给出两倍相同的值,确认masterHEAD引用相同的提交,也就是说,你 master

因此,为了创建一个引用本地当前提交的远程标签,请使用

git push origin HEAD:/refs/tags/a_tag_name

这有点像您要求远程origin在其文件中写入refs/tags/a_tag_name包含在您本地的 SHA1 的值HEAD。这会在远程存储库中创建标签。

如果你推一个null你会删除标签

git push origin :/refs/tags/a_tag_name

就这样

于 2013-10-19T17:28:43.617 回答
1

我需要将一个标签推送到远程,该标签在本地不存在并且位于远程的头部,而不是我的。

git push origin origin/head:refs/tags/foo

我们遇到了从可能获得或未获得最新版本的单个机器进行部署以及标记发布的问题。即使该版本包含最新的提交,该标签也会显示在日志的下方。

上面的答案是正确的并且解释得很好,但没有解决我对所问问题的变化。

于 2017-03-30T18:00:54.083 回答