如何对比执行git filter-branch前后的Git仓库差异?
校验git filter-branch修改后的历史差异方法
- 对比所有分支的提交拓扑与元数据
先将原仓库作为远程源添加到修改后的新仓库中:执行git remote add old-repo /path/to/your/original/repository,再执行git fetch old-repo拉取原仓库的所有分支、标签引用。
之后可以通过git log --oneline --graph分别查看新旧同名分支的提交线,确认提交拓扑没有出现断裂、丢失、多余提交的问题。如果需要批量校验,可以通过git for-each-ref遍历所有分支,导出每个分支的提交元数据(排除你要修改的字段,比如修改作者邮箱时就排除邮箱字段),直接对比两份导出结果即可快速发现异常。 - 逐提交校验变更内容
使用git range-diff命令可以直接对比两条提交序列的逐提交差异,用法示例为git range-diff old-repo/main~20..old-repo/main main~20..main,输出会明确标注两个序列中每个提交的改动差异,你可以直接确认每个提交的修改是否仅包含你预期的内容,没有额外误改。
如果需要覆盖全部分支,可以写简单脚本遍历所有新旧同名分支批量执行range-diff,排查异常。 - 校验所有引用的最终状态一致性
你已经可以通过递归diff校验工作区的最终状态,还可以通过树哈希快速校验所有分支、标签的顶端文件状态:对每个同名分支,分别执行git rev-parse <branch-name>^{tree}获取新旧仓库该分支顶端的树哈希值,若两个值完全一致,说明该分支的最终文件状态没有任何意外改动。如果你的filter-branch操作不涉及修改最终文件内容,所有分支的树哈希都应该和原仓库完全一致。
内容的提问来源于stack exchange,提问作者Wassinger
相关产品推荐
相关产品推荐

