SVN迁移至Git后,路径发生变更时如何查询分支自创建以来的所有修改文件
方案1:路径映射对比(适用于统一前缀路径变更的场景)
你的场景里标签侧所有待对比文件都存放在src目录,分支侧迁移到根目录,直接指定两个版本的对应路径做差异对比即可完全规避重命名检测的干扰,命令如下:
git diff --diff-filter=M --name-only <TAG_NAME>:src HEAD:
该命令会直接将标签版本src目录下的文件和当前分支根目录下的同名文件做内容对比,输出的结果就是仅内容发生修改的文件列表,不会包含仅路径变更、内容无修改的文件。如果有多组路径映射(比如还有其他目录也做了迁移),可以多次执行该命令指定不同的路径对即可。
方案2:过滤重命名无修改条目(适用于路径变更规则不统一的场景)
开启重命名检测后,状态为R100的文件就是仅重命名/迁移、内容100%相同的文件,直接过滤掉这类条目即可得到实际修改的文件列表,命令如下:
git diff --find-renames --name-status <TAG_NAME> | grep -v '^R100' | awk '{print $2}'
如果需要放宽内容相似度判定阈值,可以将--find-renames参数调整为--find-renames=80%(表示内容相似度低于80%的不判定为重命名),按需调整数值即可。
方案3:临时导出对比(适用于路径变更规则复杂的场景)
不需要拉取两份仓库副本,直接将两个版本的对应目录导出到临时目录做文件级对比即可:
# 创建临时目录 mkdir -p /tmp/tag_version /tmp/branch_version # 导出标签版本的对应目录 git archive <TAG_NAME>:src | tar -x -C /tmp/tag_version # 导出分支版本的对应目录 git archive HEAD: | tar -x -C /tmp/branch_version # 对比输出修改的文件列表 diff -qr /tmp/tag_version /tmp/branch_version | grep '^Files' | awk '{print $2}' | sed "s#^/tmp/tag_version/##" # 用完删除临时目录 rm -rf /tmp/tag_version /tmp/branch_version
该方案不需要调整Git的检测参数,也不需要修改历史迁移规则,对所有路径变更场景都适用。
内容的提问来源于stack exchange,提问作者Harv
相关产品推荐
相关产品推荐

