svn post-commit钩子可实现提交后自动同步至web目录,需配置可执行脚本、确保权限匹配、使用svn export或update、通过临时目录+rsync原子替换,并注意协议、路径及日志调试。

SVN钩子脚本可以实现在代码提交(commit)后,自动将最新版本同步到Web服务器的发布目录,避免手动更新或FTP上传。关键在于使用post-commit钩子,在提交完成、版本库已更新后,触发检出或更新操作。
配置 post-commit 钩子触发同步
SVN仓库的hooks/post-commit脚本会在每次成功提交后执行。需确保该脚本具有可执行权限(如chmod +x post-commit),且由运行svnserve或Apache的用户(如www-data、apache或svn)调用,否则可能因权限不足导致检出失败。
- 脚本接收两个参数:
$1为仓库路径,$2为本次提交的修订版本号(REVISION) - 推荐使用
svn export而非svn checkout/update,避免带.svn目录,更安全简洁 - 若Web目录已有工作副本,也可用
svn update,但需确保该目录是同一仓库的合法工作副本,且属SVN进程可写
同步脚本示例(export方式)
以下是一个精简可靠的post-commit脚本片段(以Linux为例):
#!/bin/bash REPOS="$1" REV="$2" WEB_PATH="/var/www/myapp" SVN_URL="file://$REPOS" <h1>导出指定版本到临时目录,再原子性替换</h1><p>TEMP_DIR="/tmp/svn-export-$$" mkdir -p "$TEMP_DIR" svn export -r "$REV" "$SVN_URL" "$TEMP_DIR" --force >/dev/null 2>&1</p><p>if [ $? -eq 0 ]; then rsync -a --delete "$TEMP_DIR/" "$WEB_PATH/" rm -rf "$TEMP_DIR" fi </p>
注意:rsync -a --delete保证目标目录与导出内容完全一致;使用临时目录+原子替换,可避免服务短暂不可用或读取不完整文件。
权限与路径注意事项
常见失败原因多与权限和路径有关:
- Web目录(如
/var/www/myapp)必须对SVN服务运行用户可写 - 若SVN通过HTTP(mod_dav_svn)访问,钩子中不能用
file://协议,应改用https://或http://URL,并确保该URL可被服务器自身访问(必要时配置免密认证或使用本地file://) - 确保
svn命令在钩子执行环境中可用(可通过which svn确认,必要时指定绝对路径如/usr/bin/svn) - 日志输出建议重定向到文件(如
>/var/log/svn-postcommit.log 2>&1),便于排查问题
安全与生产环境建议
直接同步到Web根目录存在风险,推荐增强措施:
- 限制同步范围:在脚本中校验
$REV对应提交的路径(如只同步/trunk/web/),跳过文档或测试目录 - 增加简单白名单:例如仅允许特定分支(
trunk)或标签(tags/v*)触发同步 - 避免敏感操作:不要在钩子中执行
chown或chmod,应由Web服务器用户拥有目录,或用umask控制新建文件权限 - 上线前建议先在测试环境验证钩子行为,观察日志及文件一致性
不复杂但容易忽略细节,重点是权限、路径、协议一致性以及原子性更新。做好这几项,就能稳定实现提交即上线。











