SVN关键字能否实现单次扩展?无需编写自定义提交钩子脚本
实现SVN关键字的“单次扩展”(无需自定义提交钩子)
好问题!我刚好折腾过SVN关键字替换的这个场景,不用写自定义提交钩子确实能实现你要的“单次扩展”需求,核心思路就是破坏SVN对已扩展关键字的识别格式,让它不再重复替换。
具体步骤和原理:
先确保仓库开启关键字替换
首先得保证你的目标文件已经设置了svn:keywords属性,包含你要用的关键字(比如Rev)。用命令设置的话:svn propset svn:keywords "Rev" your-changelog-file.txt这一步是基础,没有这个属性的话SVN根本不会做关键字替换。
第一次提交后修改关键字格式
当你第一次提交文件时,$Rev$会被自动扩展成$Rev: 1$(假设是第一个版本)。这时候你只需要修改这个已扩展的关键字的格式,让SVN不再把它当成可替换的关键字。比如:- 把
$Rev: 1$改成$Rev: 1 $(在版本号后面加一个空格) - 或者改成
Rev: 1(去掉前后的$符号) - 甚至改成
*$Rev: 1$*(给整个关键字加个强调标记)
为什么这招管用?因为SVN识别可替换关键字的规则是严格匹配
$关键字: 值$的格式,只要你改动这个格式的任意部分,SVN就会把它当成普通文本,不会再进行替换操作。- 把
后续新增内容的处理
之后你每次新增变更记录时,直接写$Rev$: 新增XX功能,下一次提交时这行会被扩展成对应版本号(比如$Rev: 2$: 新增XX功能),然后你再按照上面的方法修改格式,就能永久保留这个版本号了。
举个完整的例子:
- 初始文件内容:
$Rev$: 创建信息文件 - 第一次提交后,SVN自动替换为:
$Rev: 1$: 创建信息文件 - 编辑文件修改格式:
$Rev: 1 $: 创建信息文件 # 加了个空格 $Rev$: 新增用户管理模块 - 第二次提交后,文件变成:
$Rev: 1 $: 创建信息文件 $Rev: 2$: 新增用户管理模块 - 再编辑修改第二行的格式:
$Rev: 1 $: 创建信息文件 $Rev: 2 $: 新增用户管理模块 - 之后无论再提交多少次,这两行的版本号都不会再变了。
这种方法完全不需要编写任何自定义提交钩子,纯靠调整文本格式就能实现你的需求,非常适合用来维护每条变更记录对应提交版本的日志文件。
内容的提问来源于stack exchange,提问作者Johann Studanski




