本地提交代码后,服务器端的网站目录自动同步更新
要实现本地提交代码后,服务器端的网站目录自动同步更新,需要用到 SVN 的 post-commit 钩子。原理是:每次 svn commit 成功后,SVN 服务器会自动执行这个钩子脚本,在脚本里运行 svn update 命令来更新指定目录的代码。
以下是完整的配置步骤(假设你的 SVN 仓库路径为 /var/svn/svnrepos,网站目录为 /var/www/html):
第一步:在服务器上检出项目(重要)
因为钩子脚本执行 svn update 需要一个已存在的工作副本,所以需要先在服务器上用 SVN 账号检出一次项目到目标网站目录
# 进入网站根目录的上级,确保目录存在
sudo mkdir -p /var/www
cd /var/www
# 从 SVN 服务器检出项目
# 注意:这里要用 svn:// 协议,地址替换为你的实际地址
sudo svn co svn://localhost/svnrepos /var/www/html --username your-svn-user --password your-password
权限提醒:执行完这一步后,务必确保 /var/www/html 目录的属主和权限,能让运行 SVN 进程的用户(通常是 apache 或 svn 用户)有写入权限,否则后续的 update 会失败
第二步:编写 post-commit 钩子脚本
进入仓库的 hooks 目录,创建 post-commit 文件
cd /var/svn/svnrepos/hooks
sudo vim post-commit
粘贴以下脚本内容,并修改其中的网站目录、SVN地址、用户名和密码:
#!/bin/sh
# 设置字符集,避免中文文件名乱码
export LANG=en_US.UTF-8
# 定义变量
WEB_PATH="/var/www/html" # 你的网站目录
SVN_PATH="/usr/bin/svn" # svn命令路径
SVN_URL="svn://localhost/svnrepos" # 你的SVN仓库地址
SVN_USER="your-svn-user" # SVN用户名
SVN_PASS="your-password" # SVN密码
LOG_PATH="/tmp/svn_auto_update.log" # 日志文件路径
# 记录日志
echo "---------------------------------" >> $LOG_PATH
date >> $LOG_PATH
echo "开始更新: ${WEB_PATH}" >> $LOG_PATH
# 执行更新
$SVN_PATH update $WEB_PATH --username $SVN_USER --password $SVN_PASS --no-auth-cache >> $LOG_PATH 2>&1
# 检查更新结果
if [ $? -eq 0 ]; then
echo "更新成功" >> $LOG_PATH
else
echo "更新失败,请检查配置" >> $LOG_PATH
fi
exit 0
第三步:赋予脚本执行权限
必须给钩子文件添加可执行权限,否则 SVN 无法运行它
sudo chmod +x post-commit
第四步:测试效果
-
修改本地工作副本中的任意文件,执行
svn commit提交。 -
观察服务器上的网站目录
/var/www/html,里面的文件应该会自动更新。 -
如果更新异常,可以查看日志文件排查错误
cat /tmp/svn_auto_update.log
常见问题排查
1. 更新没反应?
-
检查日志:先看
/tmp/svn_auto_update.log里有没有错误信息。 -
权限问题:这是最常见的原因。检查
/var/www/html目录的权限,确保运行svnserve进程的用户有读写权限。可以尝试临时赋予777权限测试(sudo chmod -R 777 /var/www/html),确认是权限问题后再调整为合理的属主。 -
路径问题:确认钩子脚本里的
WEB_PATH是绝对路径,并且与第一步svn co检出的目录完全一致
2. 中文文件名乱码或更新失败?
在脚本开头加上 export LANG=en_US.UTF-8 通常可以解决。
3. 不想把密码明文写在脚本里?
如果觉得明文密码不安全,可以省略 --username 和 --password 参数,但需要确保运行 SVN 的系统用户(如 apache)已经通过 svn co 缓存了密码凭证