代码之家  ›  专栏  ›  技术社区  ›  Vilx-

如何防止特定分支在git中被合并?

  •  1
  • Vilx-  · 技术社区  · 7 年前

    master 发布的生产代码所在的分支 dev 测试服务器代码所在的分支,以及各种功能分支(从 主人 )每个开发者都认为合适。

    随着时间的推移 开发 分支有点偏离了 开发 与…相同 主人

    开发 开发 把所有乱七八糟的东西都带回来。我怀疑这甚至会自动发生,一个天真的 git pull

    有没有可能通过服务器端提交钩子来防止这种情况?拒绝接受这个事实的东西 git push

    3 回复  |  直到 7 年前
        1
  •  7
  •   Gasol    7 年前

    这是可能的 Git Hooks . 将以下POC脚本放到 .git/hooks/pre-receive

    例如,配置要保护的分支 master

    $ git config hooks.protected-branch.refs master
    

    文件:.git/hooks/pre-receive

    #!/bin/sh
    
    read old_value new_value ref_name
    
    refs=$(git config hooks.protected-branch.refs)
    
    for ref in $refs; do
        if [ "$ref_name" == "refs/heads/$ref" ]; then
            if [ "$old_value" == "0000000000000000000000000000000000000000" ]; then
                continue
            fi
    
            if ! git merge-base --is-ancestor "$ref_name" "$new_value"; then
                echo "$ref_name is protected branch"
                exit 1
            fi
        fi
    done
    

    当你试图重置 主人 通过强制推力,您将获得类似的输出,如下所示:

    Counting objects: 12, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (8/8), done.
    Writing objects: 100% (12/12), 920 bytes | 153.00 KiB/s, done.
    Total 12 (delta 4), reused 0 (delta 0)
    remote: refs/heads/master is protected branch
    To ../demo
     ! [remote rejected]   master -> master (pre-receive hook declined)
    error: failed to push some refs to '../demo
    
        2
  •  0
  •   Bhanu Prakash Ryaga    7 年前

    除了阻塞强制推送之外,受保护的分支还可以进行所需的状态检查。

    请检查 https://blog.github.com/2015-09-03-protected-branches-and-required-status-checks/

        3
  •  0
  •   kelvin    6 年前

    把它弄得一团糟。

    这是使用默认值时的常见问题 git pull 行为。至 git拉 使用 rebase 通过 merge . 也就是说,将当前分支重设为 远程分支而不是合并它:

    git config pull.rebase interactive

    git-config 手册页:

    拉动.rebase

    true ,在获取的分支上重新设置分支的基础,而不是 当“git pull”为 基础。

    什么时候? preserve 本地提交的合并提交不会通过运行

    当值为 interactive 模式。

    注意:这可能是一个危险的操作;除非你愿意,否则不要使用它

    push -f ), 谁拉谁就负责识别和丢弃“旧的” 在重设基础期间提交。这将导致一个干净的历史记录(即:否) 合并“旧”版本)。

    推荐文章