SVN工作流中传递修订关键字的问题及纯SVN实现方案问询
没问题,仅用SVN完全能实现你的需求!你之前觉得SVN不支持按文件类型配置关键字是个误解,其实它的属性系统和关键字功能足够灵活来解决你的问题,下面是具体的实现方案:
核心思路:差异化关键字配置 + 自定义占位符
通过给不同类型的文件设置不同的svn:keywords规则,让SVN只处理每个文件专属的关键字占位符,避免覆盖从其他文件导入的修订信息。
1. 按文件类型自动配置关键字属性
SVN的auto-props功能可以帮你根据文件扩展名自动应用不同的svn:keywords,不管是客户端还是服务器端都能配置:
- 客户端配置:打开你的SVN配置文件(Linux/macOS是
~/.subversion/config,Windows是%APPDATA%\Subversion\config),找到[auto-props]区块,添加以下规则:
这样文本文件默认启用*.txt = svn:keywords=Revision # 对应你的文件1(文本类型) *.xml = svn:keywords=FileRevision # 对应文件2、3(XML类型)Revision关键字,XML文件默认启用自定义的FileRevision关键字,两者互不干扰。 - 服务器端配置:如果要强制所有团队成员遵循这个规则,可以修改服务器的
svnserve.conf(搭配auto-props = yes)或Apache配置中的SVNAutoProps指令,实现全局生效。
2. 为文件2区分不同来源的修订号
在文件2中,你需要把来自文件1的修订号和自身的修订号用不同的占位符区分:
- 从文件1导入的修订号保留原有的
$Revision: $占位符(因为文件2的svn:keywords是FileRevision,SVN不会处理这个占位符,所以导入的内容不会被覆盖)。 - 在文件2中新增一个自定义占位符
$FileRevision: $,用来存储文件2自身的修订号。
提交文件2时,SVN只会替换$FileRevision: $为文件2的当前修订号,完全不会触碰从文件1导入的$Revision: $内容,完美保留你需要的文件1修订信息。
3. 生成文件3时获取修订号(纯SVN内置方式)
你的脚本生成文件3时,不需要依赖外部工具,直接用SVN的命令行工具获取文件1和文件2的修订号:
- 获取文件1的修订号:
svn info --show-item revision path/to/your-file1.txt - 获取文件2的修订号:
svn info --show-item revision path/to/your-file2.xml
把这两个命令的输出结果写入文件3的对应位置即可,这完全属于SVN的内置功能,符合你“仅通过SVN实现”的要求。
4. 可选:锁定属性防止误修改
为了避免团队成员误修改文件2的svn:keywords属性,你可以给文件2设置svn:needs-lock属性,这样只有锁定文件的用户才能修改属性:
svn propset svn:needs-lock yes path/to/your-file2.xml
最终效果验证
- 提交文件1后,
$Revision: $会被替换为文件1的修订号; - 导入文件1的内容到文件2后,提交文件2时,只有
$FileRevision: $会被替换为文件2的修订号,文件1的修订号完整保留; - 生成文件3时,通过SVN命令获取前两个文件的修订号并写入,满足
1 < 2 < 3的修订要求。
内容的提问来源于stack exchange,提问作者Ben Hirsig




