【发布时间】:2013-11-06 01:24:17
【问题描述】:
git 中有两个分支,我使用 gitolite 进行访问控制。
分支“开发”和分支“主”。
开发人员必须提交到'dev',并合并到'main',然后推送'dev'
和“主要”。
我的问题是如何只允许开发人员致力于“开发”,
并合并到'main',但不能直接提交到'main'。
我的意思是,如果开发人员直接将代码推送到“主”,当他们尝试
推送到远程'main',它们会失败。
【问题讨论】:
git 中有两个分支,我使用 gitolite 进行访问控制。
分支“开发”和分支“主”。
开发人员必须提交到'dev',并合并到'main',然后推送'dev'
和“主要”。
我的问题是如何只允许开发人员致力于“开发”,
并合并到'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 文件夹。)
【讨论】:
$new^1)对应于原始分支,第二个($new^2)对应于另一个分支。如果提交不是合并提交$new^2 无效并且git rev-parse 失败。
git merge --no-ff 创建合并提交。