Skip to content

Latest commit

 

History

History
22 lines (14 loc) · 2.27 KB

hunk_header_format.md

File metadata and controls

22 lines (14 loc) · 2.27 KB

hunk header:相当于hunk内容简报,一般包含添加多少行、删除多少行 等信息,末尾可能会追加一个特殊的上下文行,并非bug,实属正常现象(pc git diff行为也是如此)

解析: 英文:@@ -StartLine,Count +StartLine,Count @@ special context line 中文:@@ -起始行号,若大于1行则有计数否则没有 +起始行号,若大于1行则有计数否则没有 @@ 特殊上下文行 严格的格式(方括号内容可被省略),英文:@@ -StartLine[,Count] +StartLine[,Count] @@[ special context line]

注意:

  • -和+分别代表修改前的文件和修改后的文件。
  • StartLine那行本身会被包含,Count若为0则会被省略,换句话说Count并非一定有,其中StartLine本身就代表一行,若后面没内容,或者后面只有一个文件末尾的空行,则Count应为0,这时会被省略就不显示Count了。(参考下面的例3)
  • 不能凭count判断究竟删除或添加了多少行,因为count计数是包含上下文行的,不过可以解析header,然后分别从修改前和修改后的文件中把内容读取出来再逐行diff,这样就能判断出哪些行被修改过,哪些是上下文了。
  • 特殊上下文行应该有长度限制,libgit2貌似是 256字节 减 特殊上下文左边的上下文内容占的字节数,剩下的就是特殊上下文可用字节,不过我没验证过,而且我不清楚pc git是否也是如此,不过这个并不重要,如果解析header,直接把最后一组 "@@ " 后的内容到字符串末尾都当作特殊上下文行就行,至于其内容是否完整,并不重要。

例1,末尾不包含文本内容:@@ -3,7 +3,7 @@ 例2,末尾包含文本内容:@@ -19,7 +19,7 @@ 特殊的上下文行,可能是函数的大括号开始的那行,也可能是当前hunk内容的前一行 例3,无Count(实际是Count为0被省略了):@@ -1 +1 @@ 或者 @@ -1 +1,2 @@。无Count代表仅包含“起始行”的内容。

解析:@@ -2,1 +2,1 @@ abc 代表此hunk显示的内容为修改前的文件第2行开始,取1行,和修改后的文件第2行开始,取1行,并且他们与abc存在某种关联,可能abc是当前hunk内容的前一行,也可能abc是当前hunk所属代码块的起始行。