如何查询SVN分支未合并至主干的文件及指定文件全修订记录
我来帮你搞定这几个Subversion版本管理里的常见需求,都是日常协作中经常用到的实用操作:
1. 检查单个特性分支中未合并到主干的文件
如果只是针对某一个特性分支,直接用mergeinfo命令就能快速定位未合并的内容:
svn mergeinfo --show-revs eligible ^/trunk ^/branches/your-feature-branch
--show-revs eligible:指定只显示**可合并到目标(这里是主干)**的修订版本- 第一个路径是目标分支(主干),第二个是需要检查的特性分支
要是想直接看到这些修订对应的具体文件,可以结合svn log做进一步提取:
svn mergeinfo --show-revs eligible ^/trunk ^/branches/your-feature-branch | while read rev; do svn log -r $rev -v ^/branches/your-feature-branch | grep -E "^ [MAD]" done | sort | uniq
这个命令会把每个未合并修订里变更的文件提取出来,去重后展示。
2. 获取指定文件在主干及所有分支的全部修订版本列表
要追踪某个文件在所有分支和主干的完整提交记录(而非仅主干上的合并记录),用svn log加上--stop-on-copy参数就能实现:
svn log --stop-on-copy --verbose ^/path/to/your/target-file
--stop-on-copy:会追踪文件的起源节点(比如从主干复制到分支的时刻),完整展示分支上的所有提交,不会截止到复制操作--verbose:会显示该文件在每个修订中的具体变更细节
如果要批量遍历所有分支里的这个文件,可以用下面的小脚本:
#!/bin/bash TARGET_FILE="^/path/to/your/target-file" BRANCHES=$(svn ls ^/branches | grep "/$" | sed 's/\/$//') echo "=== 主干中文件的提交记录 ===" svn log --stop-on-copy --verbose $TARGET_FILE echo -e "\n=== 各分支中文件的提交记录 ===" for branch in $BRANCHES; do echo -e "\n--- 分支 $branch ---" svn log --stop-on-copy --verbose ^/branches/$branch/$(basename $TARGET_FILE) 2>/dev/null || echo "该分支中不存在此文件" done
3. 查询所有SVN分支中未合并到主干的文件
如果要一次性检查所有分支里未合并到主干的文件,用这个批量处理脚本就能搞定:
#!/bin/bash TRUNK_URL="^/trunk" BRANCHES_URL="^/branches" # 获取所有分支的列表 BRANCHES=$(svn ls $BRANCHES_URL | grep "/$" | sed 's/\/$//') for BRANCH in $BRANCHES; do echo "=====================================" echo "分支 $BRANCH 未合并到主干的文件:" echo "-------------------------------------" # 获取该分支中可合并到主干的修订 ELIGIBLE_REVS=$(svn mergeinfo --show-revs eligible $TRUNK_URL $BRANCHES_URL/$BRANCH) if [ -z "$ELIGIBLE_REVS" ]; then echo "无未合并变更" continue fi # 提取每个修订对应的变更文件 echo "$ELIGIBLE_REVS" | while read REV; do svn log -r $REV -q -v $BRANCHES_URL/$BRANCH | grep -E "^ [MAD]" | awk '{print $2}' done | sort | uniq done
这个脚本会自动遍历所有分支,逐个检查未合并的修订,提取出所有变更过的文件并去重,按分支清晰展示结果。
内容的提问来源于stack exchange,提问作者Martin Scharrer
相关产品推荐
相关产品推荐

