繁体   English   中英

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

[英]push to a git branch only if the remote branch already exists

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

工作流程如下所示:

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

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

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

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

如果有帮助,推送总是预计会快进,目前正在通过git push --quiet remotename HEAD

是否有git push选项可以防止在这种情况下创建分支?

--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

是否有git push选项可以防止在这种情况下创建分支?

是的, git push remotename:

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

(来自: git push --help / https://git-scm.com/docs/git-push

我读到您正在寻找原子推送,也许git push --atomic选项也是您的兴趣所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM