是否可以允许合并但禁止在git中直接提交

是否可以允许合并但禁止在git中直接提交,git,merge,commit,Git,Merge,Commit,git中的两个分支,我使用gitolite进行访问控制。 分支“dev”和分支“main”。 开发人员必须提交到“dev”,并合并到“main”,然后推送“dev” 和“main”。 我的问题是如何只允许开发人员提交到“dev”上, 并合并到“main”,但不能直接提交到“main”。 我的意思是,如果开发人员直接将代码推送到“main”,当他们试图 推到远程“main”,它们将失败。gitolite允许您添加自定义服务器端挂钩 使用此更新挂钩添加检查: #!/bin/bash ref=$1 o

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

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
创建合并提交。