代码之家  ›  专栏  ›  技术社区  ›  anthony sottile

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

git
  •  0
  • anthony sottile  · 技术社区  · 3 年前

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

    工作流程看起来像这样:

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

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

    在这种情况下,步骤4将 创造 分支机构

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

    如果这有帮助,那么推送总是被认为是快速的,目前正在通过 git push --quiet remotename HEAD

    是否有选择 git push 在这种情况下,什么会阻止分支创建?

    0 回复  |  直到 3 年前
        1
  •  3
  •   anthony sottile    3 年前

    这个 --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
    
        2
  •  1
  •   hakre    3 年前

    是否有选择 git push 在这种情况下,什么会阻止分支创建?

    对, git push remotename :

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

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

    我读到你在寻找原子推力,也许是 git推送 --atomic 这个选项也符合你的兴趣。