git - 仅当远程分支已经存在时才推送到 git 分支
问题描述
我有一个自动化系统,它有条件地提交并推送到请求请求的分支
工作流程如下所示:
- 用户提出拉取请求
- 自动化系统检查拉取请求
- (如果更改)自动化系统提交
- (如果更改)自动化系统推送到拉取请求分支
问题在于步骤 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
推荐阅读
- python - 我无法在我的 django HTML 模板中显示我的图像
- javascript - TypeScript 中的变量声明错误
- php - 使用引导产品卡表单显示数据库记录时出现问题
- validation - 一种优雅的获取结果的方式
基于 Result<_, E1> 和 Result ? - swift - RealityKit 在运行时更改 USDZ 漫反射材质
- rest-assured - 如何使用 Rest Assured 概念在控制台中显示 Json Array Response 正文
- spring - JPA Select 查询需要更多时间 - 超过 60 秒
- python - 将 dict 转储到现有的 yaml 文件中,只需在使用 ruamel.yaml 进行更新时将 dict 字符串表示形式写入文件
- java - 一个按钮应该在一分钟内只点击两次,我应该如何检查它?
- python - 当循环运行很长时间时,在循环中运行 django factory 不会创建所需数量的实例