SVN不支持按时间段自动切换只读模式,需借助外部方案实现:方案一用定时任务切换authz配置并重载服务;方案二用pre-commit hook拦截提交;方案三通过API统一调度。

SVN 本身不支持“按时间段自动切换只读模式”的原生功能。它的权限控制是静态的,依赖 authz 文件配置,且需手动重启服务或重载配置才能生效。没有内置定时器、计划任务或时间感知权限机制。
但你可以通过外部系统配合实现“指定时间段内只读”的效果,核心思路是:在目标时段前自动修改 authz 权限配置,并触发服务重载;时段结束后再恢复写权限。
以下是可行、稳定、生产环境常用的做法:
✅ 方案一:用系统定时任务(cron / Windows Task Scheduler)自动切换权限
适用于 svnserve 或 Apache + mod_dav_svn 环境。
操作步骤:
-
编写两个权限配置片段文件:
SVN搭建及使用教学视频(布尔教育)下载《SVN视频教程》,SVN:全称Subversion,是代码版本管理软件,管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。许多人会把版本控制系統想像成某种“时光机器”。
-
authz.readonly:将关键路径设为只读(例如[/trunk] * = r) -
authz.normal:恢复正常读写(例如[/trunk] @devs = rw)
-
-
准备切换脚本(以 Linux 为例,
/opt/svn/toggle_readonly.sh):#!/bin/bash AUTHZ_PATH="/path/to/repo/conf/authz" BACKUP="/path/to/repo/conf/authz.bak" case "$1" in "on") cp "$AUTHZ_PATH" "$BACKUP" cp "/opt/svn/authz.readonly" "$AUTHZ_PATH" ;; "off") cp "$BACKUP" "$AUTHZ_PATH" ;; esac # 重载服务(svnserve 需重启;Apache 需 reload) if pgrep -f "svnserve -d"; then pkill svnserve svnserve -d -r /path/to/repo else systemctl reload apache2 # 或 httpd fi
-
设置系统定时任务:
# 每天 20:00 切为只读 0 20 * * * /opt/svn/toggle_readonly.sh on
每天 08:00 恢复读写
0 8 * /opt/svn/toggle_readonly.sh off
> ⚠️ 注意: > - `svnserve` 不支持热重载 authz,必须重启进程;Apache 可 `reload`,更平滑。 > - 确保脚本有执行权限(`chmod +x`),且运行用户对 authz 文件和 SVN 进程有足够权限。 > - 建议先测试脚本手动执行是否生效,再加入定时任务。 ### ✅ 方案二:用 pre-commit hook 拦截提交(轻量级、无需重启服务) 适合不想动服务、只需“禁止提交”的场景。原理是在提交前检查当前时间,超时则拒绝。 **操作步骤:** - 编辑仓库 `hooks/pre-commit` 文件(确保可执行): ```bash #!/bin/bash REPOS="$1" TXN="$2" # 定义只读时间段(20:00–08:00) HOUR=$(date -d "$(svnlook date -t "$TXN" "$REPOS" 2>/dev/null | cut -d' ' -f2-)" +%H 2>/dev/null || date +%H) if [[ "$HOUR" -ge 20 ]] || [[ "$HOUR" -lt 8 ]]; then echo "ERROR: Repository is in maintenance mode. Commits disabled from 20:00 to 08:00." >&2 exit 1 fi exit 0
✅ 优点:无需重启服务,实时生效,不影响检出/更新。
❌ 缺点:仅拦截 commit,不能阻止svn mkdir/svn delete等写操作(这些也走 pre-commit);对svnadmin等管理员操作无效。
✅ 方案三:结合 Webhook 或运维平台统一调度(适合多仓库/企业级)
- 将权限变更封装为 API 接口(如 Flask + authz 模板引擎)
- 由运维平台(如 Jenkins、Ansible Tower、自研平台)在预定时间调用该接口
- 自动备份、替换 authz、重载服务、发通知
适合已有自动化运维体系的团队,扩展性强,可审计、可回滚。
不推荐的做法:
- 修改文件系统权限(如
chmod -w):破坏 SVN 内部一致性,可能导致svnadmin verify失败或数据损坏 - 依赖客户端设置(如
needs-lock):仅控制单文件编辑流程,无法实现整个目录时段性只读 - 在客户端做时间判断:不可靠、易绕过、无强制力
实际落地建议优先选 方案一(定时脚本),它最贴近需求、兼容所有 SVN 部署方式、逻辑清晰、便于监控和排查。

















