如何让SVN的VERSION.txt在每次提交时自动更新Revision版本号?
实现SVN每次提交自动更新VERSION.txt的修订版本号
SVN默认的关键字替换(比如Rev)只有当文件本身被包含在提交变更集中时,才会自动更新其中的$Revision标记。要实现无论提交任何文件都自动更新VERSION.txt的修订号,必须借助SVN的版本库钩子脚本,具体使用pre-commit钩子在提交前自动修改VERSION.txt并将其纳入本次提交。
具体实现步骤
1. 进入版本库的hooks目录
找到你的SVN版本库所在路径,进入其下的hooks子目录:
- Linux/macOS:执行命令
cd /path/to/your/svn/repo/hooks - Windows:直接在资源管理器中打开版本库文件夹下的
hooks文件夹
2. 创建pre-commit钩子脚本
钩子脚本分为Shell脚本(Linux/macOS)和批处理脚本(Windows)两种,选择对应系统的脚本:
针对Linux/macOS的Shell脚本
- 复制默认模板并改名:
cp pre-commit.tmpl pre-commit
- 赋予执行权限:
chmod +x pre-commit
- 编辑
pre-commit文件,替换内容为以下脚本(注意修改VERSION_FILE为实际路径):
#!/bin/sh REPOS="$1" TXN="$2" # 请修改为VERSION.txt在版本库中的实际路径,比如项目根目录就是"VERSION.txt" VERSION_FILE="VERSION.txt" # 获取即将生成的新修订号(当前最新修订号+1) NEW_REV=$(svnlook youngest "$REPOS") NEW_REV=$((NEW_REV + 1)) # 创建临时目录存放修改后的文件 TMP_DIR=$(mktemp -d) svnlook cat "$REPOS" "$VERSION_FILE" > "$TMP_DIR/$VERSION_FILE" # 替换$Revision字段 sed -i.bak "s/\$Revision: [0-9]* \$/\\\$Revision: $NEW_REV \$/" "$TMP_DIR/$VERSION_FILE" rm "$TMP_DIR/$VERSION_FILE.bak" # 检查VERSION.txt是否已在本次提交中,未加入则添加到提交 svnlook tree "$REPOS" -t "$TXN" | grep -q "^$VERSION_FILE$" if [ $? -ne 0 ]; then svnmucc -t "$TXN" -r "$REPOS" put "$VERSION_FILE" "$TMP_DIR/$VERSION_FILE" fi # 清理临时文件 rm -rf "$TMP_DIR" exit 0
针对Windows的批处理脚本
- 复制
pre-commit.tmpl为pre-commit.bat(直接在资源管理器中复制重命名即可) - 编辑
pre-commit.bat,替换内容为以下脚本(注意修改VERSION_FILE为实际路径):
@echo off setlocal enabledelayedexpansion set REPOS=%1 set TXN=%2 :: 请修改为VERSION.txt在版本库中的实际路径,比如项目根目录就是"VERSION.txt" set VERSION_FILE=VERSION.txt :: 获取即将生成的新修订号(当前最新修订号+1) for /f %%i in ('svnlook youngest %REPOS%') do set NEW_REV=%%i set /a NEW_REV=NEW_REV+1 :: 创建临时目录 set TMP_DIR=%temp%\svn_version_update mkdir %TMP_DIR% 2>nul :: 导出当前VERSION.txt到临时目录 svnlook cat %REPOS% %VERSION_FILE% > %TMP_DIR%\%VERSION_FILE% :: 使用PowerShell替换Revision字段 powershell -Command "(Get-Content '%TMP_DIR%\%VERSION_FILE%') -replace '\$Revision: \d+ \$', '\$Revision: %NEW_REV% \$' | Set-Content '%TMP_DIR%\%VERSION_FILE%'" :: 检查VERSION.txt是否在本次提交中,未加入则添加 svnlook tree %REPOS% -t %TXN% | findstr /c:"%VERSION_FILE%" >nul if errorlevel 1 ( svnmucc -t %TXN% -r %REPOS% put %VERSION_FILE% %TMP_DIR%\%VERSION_FILE% ) :: 清理临时目录 rmdir /s /q %TMP_DIR% exit 0
3. 测试钩子功能
完成配置后,做一次不修改VERSION.txt的提交(比如修改其他文件),提交完成后查看VERSION.txt中的$Revision标记,应该已经更新为最新的提交版本号。
注意事项
- 确保
VERSION_FILE的路径与项目中实际路径一致,比如VERSION.txt在src子目录下,要写成src/VERSION.txt - Linux/macOS下要确保
svnlook、sed、svnmucc命令在系统PATH中可用,且钩子脚本有执行权限 - Windows下要将Subversion的bin目录(比如
C:\Program Files\Subversion\bin)添加到系统环境变量PATH中,确保svnlook、svnmucc能被正常调用
内容的提问来源于stack exchange,提问作者Tom Woodland
相关产品推荐
相关产品推荐

