掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

如何实现一个 Git Diff 解析器

代码审阅中一个重要功能是对两个 commit 进行 diff 并展示到页面中,这篇文章将尝试总结其实现过程。

解析 Git Diff

想要展示 diff,首先需要将 Git 提供的 diff 格式解析成结构化数据(比如:JSON)。

基本格式

一个基本的 Git Diff 格式如下:

  1. diff --git a/f1 b/f1

  2. index 6f8a38c..449b072 100644

  3. --- a/f1

  4. +++ b/f1

  5. @@ -1,7 +1,7 @@

  6. 1

  7. 2

  8. 3

  9. -a

  10. +b

  11. 5

  12. 6

  13. 7

第一行是 Git Diff 的 header,进行比较的是 a 版本的 f1(变动前)和 b 版本的 f1(变动后)。

第二行是两个版本的 hash 值以及文件模式(100644 表示是文本文件)。

第三、四行表示进行比较的两个文件, --- 表示变动前的版本, +++ 表示变动后的版本。

第五行是一个 thunk header(可能会有多个),提供变动的”上下文“(context), -1,7表示接下来展示变动前文件第一至第七行, +1,7 表示接下来展示变动后文件第一至第七行。

接下来的几行就是具体的变动内容。它将两个文件的上下文合并显示在一起,每一行前面是一个标志位, ''(空)表示无变化(是一个上下文行)、 - 表示变动前文件删除的行、 + 表示变动后文件新增的行。可以看出此次变动,文件 f1 的第 4 行内容从 a 变为了 b。

扩展 header

在第一行 header 之后有可能包含如下的几种扩展 header:

  1. old mode <mode>

  2. new mode <mode>

  3. deleted file mode <mode>

  4. new file mode <mode>

  5. copy from <path>

  6. copy to <path>

  7. rename from <path>

  8. rename to <path>

  9. similarity index <number>

  10. dissimilarity index <number>

  11. index <hash>..<hash> <mode>

新增、删除、复制、重命名

新增、删除、复制、重命名文件的 Git Diff 格式有些不同,解析时需要特别注意。

新增:

  1. diff --git a/file b/file

  2. new file mode 100644

  3. index 0000000..53bffd7

  4. --- /dev/null

  5. +++ b/file

删除:

  1. diff --git a/file b/file

  2. deleted file mode 100644

  3. index 53bffd7..0000000

  4. --- a/file

  5. +++声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

  • 账号黑产风险识别

    根据手机号来查询是否命中黑产风险

    根据手机号来查询是否命中黑产风险

  • IP反查域名

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

  • 人脸卫士

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

  • 全国城市空气质量

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future