如何实现SVN两分支差异行的双向修改与无冲突合并?
SVN分支双向合并特定行不冲突的解决办法
你说的这种两个分支里某一行内容不同,双向合并不想触发冲突的情况,有两种可行的方案:
1. 使用svn:merge-ignore属性
SVN自带的svn:merge-ignore属性可以指定文件中哪些行在合并时跳过差异比较,直接忽略该行的内容不同。
操作步骤:
- 在B分支和C分支的
foo.txt文件上都设置该属性,精准匹配那行的两种内容:
这里的正则表达式用于匹配第三行的svn propset svn:merge-ignore "^(apple|banana)$" foo.txtapple或banana,如果后续行内容有变动,直接调整正则规则即可。 - 设置完成后提交属性变更:
必须在两个分支都完成该配置,才能保证双向合并时都不会触发冲突。svn commit -m "给foo.txt设置合并忽略规则,跳过第三行的apple/banana差异"
2. 自定义合并驱动脚本
通过编写自定义脚本,告诉SVN合并foo.txt时如何处理目标行的差异,实现自动解决冲突不报错。
操作步骤:
- 打开SVN配置文件(通常为
~/.subversion/config),找到[helpers]区块,将合并工具指定为你的自定义脚本:[helpers] merge-tool-cmd = my-foo-merge.sh - 创建
my-foo-merge.sh脚本,逻辑为合并时保留当前分支的第三行内容:#!/bin/bash BASE=$1 LOCAL=$2 REMOTE=$3 MERGED=$4 # 先将基础版本文件复制到合并结果文件 cp $BASE $MERGED # 将第三行替换为当前分支(LOCAL)的内容 sed -i '3c'"$(sed -n '3p' $LOCAL)" $MERGED exit 0 - 给脚本添加执行权限:
后续合并chmod +x my-foo-merge.shfoo.txt时,SVN会自动调用该脚本处理目标行,不会标记冲突。
注意事项
svn:merge-ignore的正则表达式要准确,避免误匹配其他行;- 自定义脚本的逻辑可按需调整,比如想保留远程分支的内容,只需将脚本中的
LOCAL替换为REMOTE; - 两种方案都需要在两个分支完成配置,才能实现双向合并无冲突。
内容的提问来源于stack exchange,提问作者Dan R.
相关产品推荐
相关产品推荐

