如何自动确定SVN合并至指定版本时的起始版本
如何自动确定SVN合并的起始版本并写入脚本
SVN通过svn:mergeinfo属性记录分支已合并的修订历史,这也是直接合并trunk HEAD时能自动识别起始版本的核心机制。要实现自动合并到指定版本,关键是从该属性或SVN命令中提取已合并的最新修订号,进而确定待合并的起始版本。
方法一:使用svn mergeinfo直接获取待合并的起始修订号
SVN提供了mergeinfo子命令,可以直接列出当前分支尚未合并的trunk修订号。通过这个命令能快速得到合并的起始版本:
# 获取当前分支中待合并的trunk起始修订号 start_rev=$(svn mergeinfo --show-revs eligible "^/trunk" . | head -n 1) # 指定要合并到的trunk目标版本 target_rev=2523 # 检查是否有待合并的修订 if [ -z "$start_rev" ]; then echo "没有需要合并的修订版本" exit 0 fi # 检查目标版本是否早于起始版本(即已全部合并) if [ "$target_rev" -lt "$start_rev" ]; then echo "目标版本已全部合并到当前分支" exit 0 fi # 执行合并 svn merge -r "$start_rev:$target_rev" "^/trunk"
方法二:解析svn:mergeinfo属性提取最后合并的修订号
如果需要更底层的控制,可以直接读取svn:mergeinfo属性,解析出已合并的trunk最新修订号:
# 获取当前分支的mergeinfo属性 mergeinfo=$(svn propget svn:mergeinfo .) # 提取trunk对应的合并记录 trunk_merge_record=$(echo "$mergeinfo" | grep "^/trunk") # 解析出已合并的最新修订号 # 处理两种情况:单一版本(如^/trunk:2417)或版本范围(如^/trunk:2417-2526) last_merged_rev=$(echo "$trunk_merge_record" | sed -E 's/^\/trunk:([0-9]+)-([0-9]+)$/\2/' | sed -E 's/^\/trunk:([0-9]+)$/\1/') # 待合并的起始版本为最后合并版本+1 start_rev=$((last_merged_rev + 1)) # 指定目标版本 target_rev=2523 # 执行合并(SVN会自动跳过已合并的版本,即使起始版本包含已合并项) svn merge -r "$start_rev:$target_rev" "^/trunk"
注意事项
- 执行脚本前确保当前目录处于发布分支的工作副本中。
- 若分支从未合并过trunk内容,
mergeinfo属性可能不存在,此时起始版本应为1(或根据实际需求调整)。 - 合并后建议执行
svn status检查冲突,并提交合并结果。
内容的提问来源于stack exchange,提问作者basin
相关产品推荐
相关产品推荐

