要让svn用户能自己修改已提交的日志,核心是服务端配置pre-revprop-change钩子脚本,仅允许修改svn:log属性且限本人或管理员操作;客户端通过tortoisesvn右键edit log message修改,需清除缓存并刷新。

要让SVN用户能自己修改已提交的日志,核心是服务端配置 pre-revprop-change 钩子脚本,并确保它只允许修改 svn:log 属性、且限制为本人或管理员操作。客户端操作本身简单,但没这个钩子,右键“Edit log message”会直接报错。
Windows(VisualSVN Server)配置步骤
进入对应仓库的 hooks 目录(如 C:\Repositories\myrepo\hooks\),新建文件 pre-revprop-change.bat,内容如下:
- 用记事本保存为 ANSI 或 UTF-8 without BOM 编码,避免乱码导致脚本执行失败
- 脚本需明确放行
svn:log的修改动作(M),并校验用户权限:
@ECHO OFF set REPOS=%1 set REV=%2 set USER=%3 set PROPNAME=%4 set ACTION=%5 <p>:: 只允许修改 svn:log 属性 if /I not "%PROPNAME%" == "svn:log" goto ERROR_PROP</p><p>:: 只允许修改(M),不允许新增(A)或删除(D) if /I not "%ACTION%" == "M" goto ERROR_ACTION</p><p>:: 允许管理员(如 admin)修改任意日志;普通用户只能改自己的 for /f "usebackq" %%k in (<code>"C:\Program Files\VisualSVN Server\bin\svnlook.exe" author "%REPOS%" -r "%REV%"</code>) do @set AUTHOR=%%k if "%USER%" == "admin" goto ALLOWED if "%USER%" == "%AUTHOR%" goto ALLOWED</p><p>goto ERROR_USER</p><p>:ALLOWED exit 0</p><p>:ERROR_PROP echo Property '%PROPNAME%' cannot be changed. >&2 goto ERROR_EXIT</p><p>:ERROR_ACTION echo Action '%ACTION%' is not allowed. >&2 goto ERROR_EXIT</p><p>:ERROR_USER echo You can only modify your own log messages. >&2 goto ERROR_EXIT</p><p>:ERROR_EXIT exit 1</p>
- 保存后无需重启服务,VisualSVN Server 会自动加载
- 注意检查
svnlook.exe路径是否与你实际安装位置一致
Linux(Subversion原生服务)配置步骤
在仓库 hooks/ 目录下,将 pre-revprop-change.tmpl 复制为 pre-revprop-change,并赋予可执行权限:
cp pre-revprop-change.tmpl pre-revprop-changechmod +x pre-revprop-change- 编辑该脚本,关键逻辑示例(bash):
#!/bin/sh REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5" <h1>只允许修改 svn:log</h1><p>if [ "$PROPNAME" != "svn:log" ]; then echo "Only svn:log may be modified." >&2 exit 1 fi</p><h1>只允许修改(M)</h1><p>if [ "$ACTION" != "M" ]; then echo "Only modifications (M) are allowed." >&2 exit 1 fi</p><h1>获取原始提交者</h1><p>AUTHOR=$(/usr/bin/svnlook author "$REPOS" -r "$REV" 2>/dev/null)</p><h1>管理员或本人可改</h1><p>if [ "$USER" = "admin" ] || [ "$USER" = "$AUTHOR" ]; then exit 0 else echo "You may only edit your own log messages." >&2 exit 1 fi</p>
客户端操作与缓存处理
钩子生效后,在 TortoiseSVN 中即可操作:
- 右键工作副本 → Show log
- 找到目标版本 → 右键该条目 → Edit log message
- 输入新日志,点击确定
- 若修改后仍显示旧内容,说明缓存未刷新:
→ 打开 TortoiseSVN Settings → Saved Data
→ 分别点击 Log messages (Show log dialog) 和 Log messages (Input dialog) 旁的 Clear
→ 回到日志窗口按 F5 刷新
常见问题排查
如果仍提示“Repository has not been enabled to accept revision propchanges”:
- 确认钩子文件名完全正确(
pre-revprop-change.bat或pre-revprop-change,无扩展名错误) - 检查脚本是否以
exit 0正常结束(任何非零退出码都会拒绝修改) - 确保 SVN 用户名与
svnlook author返回值完全一致(大小写、空格敏感) - 命令行测试:运行
svn propset --revprop -r 123 svn:log "test" URL,观察是否报错











