【问题标题】:is it possible to allow merge but forbid directly committing in git是否可以允许合并但禁止直接在git中提交
【发布时间】:2013-11-06 01:24:17
【问题描述】:

git 中有两个分支,我使用 gitolite 进行访问控制。
分支“开发”和分支“主”。
开发人员必须提交到'dev',并合并到'main',然后推送'dev' 和“主要”。
我的问题是如何只允许开发人员致力于“开发”,
并合并到'main',但不能直接提交到'main'。
我的意思是,如果开发人员直接将代码推送到“主”,当他们尝试 推送到远程'main',它们会失败。

【问题讨论】:

    标签: git merge commit


    【解决方案1】:

    gitolite 允许您添加自定义服务器端挂钩。

    使用此更新挂钩添加检查:

    #!/bin/bash
    ref=$1
    old=$2
    new=$3
    
    [[ $ref == refs/heads/main ]] || exit 0
    
    reject(){
      echo "$@"
      exit 1
    }
    
    parent=$(git rev-parse $new^)
    [[ $parent == $old ]] || reject not a single commit
    git rev-parse $new^2 &>/dev/null || reject not a merge commit
    

    (对于 gitolite,您必须将其放入 update.secondary 文件夹。)

    【讨论】:

    • 更好的是,使用 Gitolite,您可以将权限授予某些用户。也许您可以通过强制他们使用 Jenkins 作业或其他一些机制来执行合并/提交来控制对合并和提交的访问。
    • @michas,你能告诉我如何区分合并的提交吗?从一般提交?我只能通过 gitk 来区分它们。
    • 一个合并提交(通常)有两个父级。第一个($new^1)对应于原始分支,第二个($new^2)对应于另一个分支。如果提交不是合并提交$new^2 无效并且git rev-parse 失败。
    • @michas,但如果合并解析为快进,它将不起作用
    • 一个“合并”解析为快进不是合并,它只是一个普通的提交。如果您有意进行合并,请始终使用 git merge --no-ff 创建合并提交。
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2015-12-01
    • 2016-08-28
    • 2011-04-18
    相关资源
    最近更新 更多