可通过subversion pre-commit钩子限制非授权用户修改公共分支;需定义^/trunk、^/branches/release-.*等受保护路径及alice、bob、admin等白名单用户,脚本用svnlook提取变更路径与作者,正则匹配路径并校验用户权限,违规则报错退出。

可以通过 Subversion 的 pre-commit 钩子脚本,在提交前检查用户身份与目标路径,拒绝非授权用户对公共分支(如 trunk、branches/release- 等)的修改。
明确受保护的分支路径和白名单用户
先梳理哪些路径属于“公共分支”,例如:
^/trunk^/branches/release-.*^/branches/support-.*
再确定允许直接提交的用户(如核心维护者),比如:alice、bob、admin。其余用户需走代码评审流程,禁止直推。
编写 pre-commit 钩子判断逻辑
钩子脚本需完成三件事:提取本次提交涉及的路径、识别提交者、匹配是否违反规则。以 Bash 脚本为例(Linux/SVN 服务端):
- 用
svnlook changed -t "$TXN" "$REPOS"获取所有变更路径 - 用
svnlook author -t "$TXN" "$REPOS"获取提交用户名 - 对每个变更路径,用正则判断是否命中公共分支模式;若命中,再检查用户是否在白名单中
- 发现违规即输出提示信息,并以非零退出码中止提交(
exit 1)
示例关键判断片段(Bash)
以下为简化逻辑示意(实际部署前请充分测试):
# 假设 $CHANGED_PATH 是某条变更路径,$AUTHOR 是提交者
if [[ "$CHANGED_PATH" =~ ^/trunk(/|$) ]] || \
[[ "$CHANGED_PATH" =~ ^/branches/(release|support)- ]]; then
case "$AUTHOR" in
alice|bob|admin) : ;; # 允许
*) echo "ERROR: User '$AUTHOR' is not allowed to modify public branches." >&2
exit 1
;;
esac
fi
注意事项与增强建议
避免常见疏漏:
- 路径匹配要覆盖子目录(如
/trunk/src/也属于 trunk),正则末尾加(/|$)防误判 - 确保钩子文件可执行(
chmod +x pre-commit),且属主与 SVN 进程一致(如svn用户) - 不依赖客户端环境变量(如
$USER),只信任svnlook author返回值 - 可扩展支持按目录配置权限(读取外部权限文件),或集成 LDAP 组校验提升可维护性











