同时推送git commits和tag


387

我知道git push --tags与普通old分开进行操作的原因git push。推送标签应该是一个明智的选择,因为您不想意外地推送标签。没关系。但是有没有办法将两者结合在一起?(除了git push && git push --tags。)


4
你有什么问题git push && git push --tags
2010年

21
没什么特别的,因为连接必须建立两次,所以速度变慢。
Will Robertson 2010年

16
请参阅下面的更新答案:--follow-tags从git 1.8.3开始有一个新选项
VonC

24
不单独进行这些操作的另一个原因是,当您具有这种自动化功能时,避免为同一提交触发两个CI构建。
亚历克斯R

--tags无法区分轻量级标签和带注释的标签来源
karlsebal

Answers:


554

2015年5月更新

git 2.4.1开始,您可以执行

git config --global push.followTags true

如果设置为true,则默认情况下启用--follow-tags选项。
您可以在推送时通过指定--no-follow-tags覆盖此配置。

正如马特·罗杰斯(Matt Rogers)在回答韦斯·赫德Wes Hurd)时所说的那样:

--follow-tags 仅推送带注释的标签

git tag -a -m "I'm an annotation" <tagname>

那将被推送(与git tag <tagname>轻量级标签相对,该轻量级标签不会被推送,正如我在这里提到的

2013年4月更新

git 1.8.3(2013年4月22日)开始您不再需要执行2条命令来推送分支,然后再推送标签

新的“ --follow-tags”选项告诉“ git push”,以推动分支出来的时候推动相关附注的标签

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

git push --follow-tags

但这不会推送所有本地标记,仅推送由.com引用的提交git push

Git 2.4.1+(2015年第二季度)将引入该选项push.followTags:请参见“ 如何使“ git push”在分支内包含标签? ”。

原始答案,2010年9月

核选项将是git push --mirror,它将把所有的参考文献推到下面refs/

您还可以在当前分支提交中仅推送一个标签:

git push origin : v1.0.0 

您可以将--tags选项与refspec 结合使用,例如:

git push origin --tags :

(自--tags装置:所有参考文献下refs/tags被推动,除了在命令行上明确列出refspecs


您还拥有此条目“ 通过单个“ git push”调用来推送分支和标签

ZoltánFüzesi 刚刚在Git邮件列表中发布了一个方便的提示:

.git/config用来解决这个问题:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

添加这些行后,git push origin将上传您的所有分支和标签。如果您只想上传其中一些,则可以枚举它们。

自己还没有尝试过,但是在将其他同时推送分支和标签的方式添加到git push中之前,它似乎很有用。
另一方面,我不介意键入:

$ git push && git push --tags

当心,因为评论Aseem纪

push = +refs/heads/*强制推送您所有的分支

刚才这有点伤我,仅供参考。


RenéScheibe添加了这个有趣的评论

--follow-tags参数具有误导性,因为仅.git/refs/tags考虑下面的标签。
如果git gc运行,则标签从.git/refs/tags移至.git/packed-refs。之后git push --follow-tags ...无法再按预期工作了。


3
您链接到的帖子上的一个评论正确指出,push = +refs/heads/*强制推入所有分支。刚才这有点伤我了,仅供参考。
2012年

2
回复:--follow-tagsgit 1.8.3中添加的标志,我可以配置git安装使其成为默认设置吗?
Trevor Burnham

1
@TrevorBurnham没有,只有值push.defaultgit-scm.com/docs/git-config)可以定义上推默认动作(nothingmatchingupstreamsimple如在stackoverflow.com/a/10002469/6309)。您需要--follow-tag显式添加。
VonC

1
@VonC如果我想强制按下标签怎么办?git push --follow-tags -f没有为我工作。
mauryat 2014年

1
--follow-tags参数具有误导性,因为仅.git/refs/tags考虑下面的标签。如果git gc运行,则标签从.git/refs/tags移至.git/packed-refs。之后git push --follow-tags ...无法再按预期工作了。
勒内·沙伊贝

4

也许这可以帮助某人:

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          

我使用git-2.21.0.windows.1尝试了您的解决方案,发现3只推了标签
Dustin Sun

在我的末端工作正常。您正在按顺序尝试所有3个命令,并且已设置了远程仓库(git remote -v)?
拉杰什·古普塔

我在步骤1中使用了“ git commit -m” msg“,没有-a参数。这可能是原因。谢谢您的跟进!
Dustin Sun

2

@自Git 2.4起

git push --atomic origin <branch name> <tag>


0

Git GUI

Git GUI有一个PUSH按钮-赦免双关语,它打开的对话框有一个标签复选框。

我从命令行推送了一个没有标签的分支,然后再次尝试使用--follow-tags上面介绍的选项推送该分支。该选项描述为以下带注释的标记。我的标签是简单的标签。

我修复了一些问题,用修复程序标记了提交(以便同事可以选择修复程序),然后更改了软件版本号并标记了我创建的发行版(以便同事可以克隆该发行版)。

Git回来说一切都是最新的。它没有发送标签!也许是因为标签没有注释。也许是因为分支上没有新内容。

当我使用Git GUI进行类似的推送时,标签已发送。

使用Git GUI发送的标签

目前,我将使用Git GUI(而非命令行和)将更改推送到我的遥控器--follow-tags

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.