同时推送git提交和标签

qmb5sa22  于 2023-03-11  发布在  Git
关注(0)|答案(6)|浏览(223)

git push --tagsgit push的一个独立操作,因为推送标签应该是一个有意识的选择,以避免意外地推送错误的标签。这很好。但是我如何同时/原子地推送它们呢?(git push && git push --tags不是完全原子的。)

ugmeyewa

ugmeyewa1#

2020年8月更新

正如最初在SoBeRichthis回答中提到的,以及在我的own answer中提到的,截至git 2.4.x

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

(Note:实际上是work with HTTPS only with Git 2.24
2015年5月更新
git 2.4.1开始,您可以

git config --global push.followTags true

如果设置为true,则默认启用--follow-tags选项。
您可以通过指定--no-follow-tags在推送时覆盖此配置。
this thread by Matt Rogers answering Wes Hurd中所述:
--follow-tags仅推送带注解的标记

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

这将被推送(与git tag <tagname>相反,git tag <tagname>是一个轻量级标记,不会被推送,如I mentioned here
2013年4月更新
从git 1.8.3(April 22 d,2013)开始,你不再需要执行两个命令来推送分支,然后推送标签
新的“--follow-tags“选项告诉“git push在推出分支时推出相关的注解标记
现在,在推送新提交时,您可以尝试:

git push --follow-tags

这不会推送 * 所有 * 本地标签,只会推送由git push推送的提交所引用的标签。
Git 2.4.1+(2015年第二季度)将引入push.followTags选项:参见“How to make “ git push ” include tags within a branch?“。
原始答案,2010年9月
核选项将是git push --mirror,这将把所有的参考下refs/
你也可以在当前的分支提交中只推送一个标签:

git push origin : v1.0.0

您可以将--tags选项与如下refspec组合使用:

git push origin --tags :

(因为--tags表示:推送refs/tags下的所有引用,除了命令行中明确列出的引用规范
您还可以输入“Pushing branches and tags with a single "git push" invocation
Zoltán Füzesi刚刚在Git mailing list上发布了一个实用的提示:
我使用.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 Kishore所评论

push = +refs/heads/*强制推送所有分支
它刚才咬了我,告诉你。
René Scheibe添加了以下有趣的注解:
--follow-tags参数容易引起误解,因为只考虑.git/refs/tags下的标记。
如果运行git gc,则标记将从.git/refs/tags移动到.git/packed-refs。之后,git push --follow-tags ...不再按预期工作。

ovfsdjhp

ovfsdjhp2#

自Git 2.4以来:

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

gg0vcinb3#

假设你在github上创建了一个新的repo,那么第一步就是克隆这个repo:git clone {Your Repo URL}
你做你的工作,添加一些文件,代码等,然后推送您的更改:

git add .
git commit -m "first commit"
git push

现在我们的修改在main分支中。让我们创建一个标签:

git tag v1.0.0                    # creates tag locally     
git push origin v1.0.0            # pushes tag to remote

如果要删除标记:

git tag --delete v1.0.0           # deletes tag locally    
git push --delete origin v1.0.0   # deletes remote tag
sauutmhj

sauutmhj4#

刚刚在git 2.31.0上测试过:git push <refspec> --tags。这样做的优点是它推送所有标签,而不仅仅是像--follow-tags这样的注解标签。

o2gm4chl

o2gm4chl5#

为了避免在Gitlab上为同一个提交触发两个CI构建:

git push -o ci.skip && git push --tags

如@user1160006在此建议。

smtd7mpg

smtd7mpg6#

Git GUI有一个PUSH按钮-请原谅这个双关语,它打开的对话框有一个标签复选框。
我从命令行推送了一个没有标记的分支,然后使用上面描述的--follow-tags选项再次尝试推送该分支。该选项描述为以下带注解的标记。我的标记是简单的标记。
我已经修复了一些东西,用修复标记了提交,(这样同事们就可以挑选修复),然后更改了软件版本号,并标记了我创建的发布版本(这样同事们就可以克隆那个发布版本)。
Git返回时说一切都是最新的,但它没有发送标签,可能是因为标签没有注解,也可能是因为分支上没有新内容。
当我使用Git GUI执行类似的推送操作时,标签被发送了。

目前,我打算使用Git GUI将我的更改推送到远程设备,而不是使用命令行和--follow-tags

相关问题