如何获取单次commit中修改、新增或删除的文件(单仓库含stage、prod目录场景)
核心原因
目前返回两次提交全量变更的本质是默认对比了两棵完整提交树,没有限定查询路径范围,不需要拆分仓库,通过路径过滤即可实现需求。
解决方案
原生Git命令行方案
- 仅查询
stage目录下的提交变更,执行:
命令会自动过滤git diff <上一次提交ID> <当前提交ID> -- stage/prod目录的所有改动,仅返回stage目录下的新增、修改、删除文件列表。 - 仅查询单个文件的变更,直接指定对应文件路径即可:
git diff <上一次提交ID> <当前提交ID> -- stage/xxx/config.json - 仅查看某次提交中指定目录的改动,也可以用
git show命令:git show <提交ID> -- stage/
JGit 代码实现方案
你之前使用的JGit全量diff逻辑只要增加路径过滤规则即可:
- 构造
DiffFormatter时添加PathFilter过滤规则,查询stage目录时配置PathFilter.create("stage/"),Diff生成时会自动过滤其他路径的变更 - 也可以在遍历DiffEntry列表时,手动校验条目的
newPath/oldPath前缀,仅保留目标目录下的条目 - 如果只需要查询单个文件的差异,不需要对比整棵提交树:直接通过
RevWalk获取该文件上一次提交的blob哈希,和当前版本的blob哈希直接做对比即可,性能优于全树对比。
进阶隔离方案
如果不想每次查询都手动加过滤规则,也可以给两个进程配置独立的稀疏检出工作区:
- 给stage进程单独配置只包含
stage目录的稀疏检出工作区,该工作区的所有提交、diff操作默认只会涉及stage目录的内容 - prod进程同理配置独立的稀疏检出工作区,两个进程操作完全隔离,不需要拆分仓库。
内容的提问来源于stack exchange,提问作者arielBodyLotion
相关产品推荐
相关产品推荐

