仅当远程分支已经存在时才推送到git分支

仅当远程分支已经存在时才推送到git分支,git,Git,我有一个自动系统,它有条件地提交并推送到请求的拉分支 工作流程如下所示: 用户发出拉取请求 自动系统检查退出请求 如果更改,自动系统将进行提交 如果更改自动系统推拉请求分支 问题是在第1步和第4步之间有一个竞争,用户删除了他们的分支 在这种情况下,步骤4将创建一个分支 我想做的只是推到分支(如果存在的话)。在推之前检查分支是否存在不是一个解决方案,因为它不能在原子步骤中完成,它会减少竞争条件,但不会消除竞争条件 如果有帮助的话,推送总是希望是快进的,并且当前是通过git push-quiet r

我有一个自动系统,它有条件地提交并推送到请求的拉分支

工作流程如下所示:

用户发出拉取请求 自动系统检查退出请求 如果更改,自动系统将进行提交 如果更改自动系统推拉请求分支 问题是在第1步和第4步之间有一个竞争,用户删除了他们的分支

在这种情况下,步骤4将创建一个分支

我想做的只是推到分支(如果存在的话)。在推之前检查分支是否存在不是一个解决方案,因为它不能在原子步骤中完成,它会减少竞争条件,但不会消除竞争条件

如果有帮助的话,推送总是希望是快进的,并且当前是通过git push-quiet remotename头推送的

在这种情况下,是否有一个git push选项可以阻止分支创建

在这种情况下,是否有一个git push选项可以阻止分支创建

是,git push remotename:

特殊的refspec:指示Git推送匹配的分支:对于本地端上存在的每个分支,如果远程端上已经存在同名的分支,则更新远程端

发件人:git推送-帮助/

我了解到您正在寻找原子推送,也许git推送-原子选项也是您感兴趣的。

带租约的-force选项允许您执行条件推送

管道基本上变成:

orig_commit=$git rev parse HEAD 执行副作用+提交。。。 git push remotename HEAD-force with lease=branchname:${orig_commit} 删除远程分支时,会生成错误消息并退出非零:

$ git push origin HEAD --force-with-lease=branchname:21bd2ef3e67adf7b8a5fc56a7e26a2a25589f346
To github.com:asottile/astpretty
 ! [rejected]        HEAD -> branchname (stale info)
error: failed to push some refs to 'git@github.com:asottile/astpretty'
当远程分支存在于上一版本时:

$ git push origin HEAD --force-with-lease=branchname:21bd2ef3e67adf7b8a5fc56a7e26a2a25589f346
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 183 bytes | 183.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:asottile/astpretty
   21bd2ef..77bcec3  HEAD -> branchname

我唯一能想到的就是获取所有远程分支,然后用脚本检查您考虑推送的分支是否存在,不应该太复杂。@Michael请仔细阅读:推之前检查分支是否存在不是一个解决方案,因为它不能在原子步骤中完成,它会减少竞争条件,但不会消除竞争条件it@AnthonySottile我确信这不能在客户端以原子方式完成。它可以通过预接收或挂钩在服务器端完成。@AnthonySottile:我也不确定推送的原子性是否是您想要的,但是,不在推送上创建远程分支是可能的,请参阅我的答案。这不起作用的原因有2个:1它推送与目标分支无关的分支;2它不指示推送是否成功;1如果不选择删除任何其他分支,则仅为推送相关分支创建临时本地克隆。是的。如果推送失败,它会通过退出状态告知(例如)连接或身份验证错误。推送在标准输出上报告,未创建远程分支的成功推送会给出最新消息,更新远程分支的成功推送会显示哪个分支已从/更新到git push。关于输出的含义,请参阅文档。在一个分支场景中,在这两种情况之间做出决定是微不足道的。我刚刚尝试过,它只显示所有最新的退出代码0。这意味着没有必要进行更新。远程分支已被删除,因此没有要推送的内容,所有内容都是最新的;或者远程分支已更新,因此没有要推送的内容,所有内容都是最新的。按照原始描述,如果存储库添加了新的提交,则必须检查存储库。如果是这种情况,则远程分支已被删除,否则您将在输出中看到分支已更新。是的,很抱歉,对来自stdout的英文消息进行解析对于脚本编写是不可接受的。我找到了一个更好的方法——我想我会自己回答的