首页 > 解决方案 > 仅当远程分支已经存在时才推送到 git 分支

问题描述

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

工作流程如下所示:

  1. 用户提出拉取请求
  2. 自动化系统检查拉取请求
  3. (如果更改)自动化系统提交
  4. (如果更改)自动化系统推送到拉取请求分支

问题在于步骤 1 和步骤 4 之间存在竞争,用户删除了他们的分支。

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

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

如果有帮助,则总是期望推送是快进的,并且当前正在通过git push --quiet remotename HEAD

git push在这种情况下是否有阻止创建分支的选项?

标签: git

解决方案


--force-with-lease选项允许您执行条件推送

管道本质上变成:

orig_commit=$(git rev-parse HEAD)

# perform side-effects + commits ...

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

推荐阅读