问题描述
当我在 C# 文件上使用 git diff
时,我看到如下内容:
diff --git a/foo.cs b/foo.cs索引 ff61664..dd8a3e3 100644--- a/foo.cs+++ b/foo.cs@@ -15,6 +15,7 @@ static void Main(string[] args)字符串名称 = Console.ReadLine();}Console.WriteLine("你好 {0}!", name);+ Console.WriteLine("再见");}}}
大块头行包含当前方法的第一行(static void Main(string[] args)
),很棒.但是它似乎不是很可靠......我看到很多情况下它不起作用.
所以我想知道,这段摘录来自哪里?git diff
是否以某种方式识别语言语法?有没有办法自定义?
配置定义在.gitattributes
, sectionDefining自定义大块头:
首先,在 .gitattributes
中,您需要为路径分配 diff
属性.
*.tex diff=tex
然后,您将定义一个diff.tex.xfuncname
";配置以指定与您希望显示为大块标题TEXT
"的行匹配的正则表达式.将一个部分添加到您的 $GIT_DIR/config
文件(或 $HOME/.gitconfig
文件)中,如下所示:
[diff tex"]xfuncname = "^(\\(sub)*section\{.*)$";
注意.配置文件解析器会吃掉一层反斜杠,因此您需要将反斜杠加倍;上面的模式选择一行以反斜杠开头,零次或多次出现 sub 后跟 section 后跟左大括号,直到行尾.
有一些内置模式可以使这更容易,tex
就是其中之一,因此您不必在配置文件中编写上述内容(您仍然需要启用此与属性机制,通过.gitattributes
).
('csharp
' 是当前内置模式的一部分)
这段摘录来自哪里?git diff
是否以某种方式识别语言语法?
最初,该算法对于函数名称检测非常粗糙:
请参阅 commit acb7257(Git 1.3.0,2006 年 4 月,作者:Mark Wood)/p>
xdiff
:在大块头中显示函数名称.
内置差异生成器的速度不错;但是函数名diff -p
显示的真的很好.我讨厌不得不选择.
所以,我们破解 xdiff
来找到函数名并打印出来.
函数名由一个特别愚蠢的算法解析时刻:它只是尝试在旧"文件中找到一行,从之前大块头的开始,他的第一个角色看起来很有道理.还是这样绝对是一个开始.
它是通过 get_func_line() 改进的,它本身来自 commit f258475(Git 1.5.3,2007 年 9 月,作者:C Hamanohttps://github.com/gitster" rel="nofollow noreferrer">gitster
))
您可以在提交测试中看到 t/t4018-diff-funcname.sh
,测试自定义的差异函数名称模式.
基于每个路径属性的大块头选择.
这使得diff -p
"通过 gitattributes
机制定制的大块头文件.
它基于 Johannes 的早期补丁,该补丁允许定义单个正则表达式用于一切.
到达用于定义hunk header的regexp的机制与 gitattributes
的其他用法相同.
您分配一个属性,funcname
(因为diff -p
"通常使用补丁所涉及的函数的名称作为大块头),一个简单的字符串值.
这可以是内置模式的名称之一(当前,java
"已定义)或自定义模式名称,可从配置文件中查找.
(在 .gitattributes 中)*.java 函数名=java*.perl funcname=perl(在 .git/config 中)[函数名称]java = ... # 丑陋而复杂的正则表达式来覆盖内置的正则表达式.perl = ... # 另一个丑陋而复杂的正则表达式来定义一个新的正则表达式.
当前的 xfuncname
语法在 commit 45d9414 中引入>,Git 1.6.0.3,2008 年 10 月,作者:Brandon Casey
diff.*.xfuncname
使用扩展"用于大块头选择的正则表达式
目前,'diff -p
' 生成的大块头文件可通过以下方式自定义在配置文件中设置 diff.*.funcname
选项.'funcname
' 选项采用基本的正则表达式.此功能是使用 GNU 正则表达式库设计的,默认情况下,即使在基本正则表达式模式下,它也允许使用某些扩展正则表达式运算符的反斜杠版本.例如,以下字符在使用反斜杠时会根据扩展的正则表达式规则进行解释:?
、+
和 |
.
因此,内置的 funcname
模式是使用一些扩展的正则表达式运算符.
其他更严格遵守 POSIX 规范的平台没有解释基本正则表达式中的反斜杠扩展 RE 运算符模式.这会导致内置 funcname 模式的模式匹配在这些平台上失败.
引入一个使用扩展正则表达式的新选项xfuncname
",并宣传它而不是funcname
.
由于大多数用户都在 GNU 平台上,因此大多数 funcname
模式都是在那里创建和测试的.
仅宣传 xfuncname
应该有助于避免创建非便携式模式,这些模式适用于 GNU 正则表达式,但不适用于其他地方.
另外,扩展的正则表达式可能不那么难看与基本 RE 相比复杂,因为许多常见的特殊运算符不需要反斜杠.
例如,GNU Basic RE:
^[ ]*\(\(public\|static\).*\)$
成为以下扩展 RE:
^[ ]*((public|static).*)$
最后,它已经扩展为 commit 14937c2,for .(2011 年 12 月),作者:René Scharfe.
diff
:添加选项以将整个函数显示为上下文
将选项 -W
/--function-context
添加到 git diff
.
它类似于 git grep
和扩展了变化块的上下文,以便显示整个周围的功能.
这种自然"上下文可以让人们更好地理解变化.
它仍在 Git 2.15(2017 年第四季度)中进行调整
检测函数头"的内置模式对于 HTML 做了不匹配没有任何属性的
元素,它有已修复...
在 2.15 之前,它无法匹配
,而 ...
匹配....
请参阅 commit 9c03cac(2017 年 9 月 23 日 https)伊利亚坎特 (iliakan
).
检测函数边界的模式称为xfuncref
.
请参阅 commit a807200(2019 年 11 月 8 日https)由 Łukasz Niemier (hauleth
).
,对于 2019 年 12 月 1 日),25 (2019 年 12 月 1 日)/p>
userdiff
:将 Elixir 添加到支持的用户差异语言
在 Elixir 语言中添加对 xfuncref
的支持,该语言是类似 Ruby 的语言在 Erlang 虚拟机 (BEAM) 上运行.
还有:
请参阅 commit d1b1384(2019 年 12 月 13 日)https://Ed Maste (emaste
).
userdiff
:从elixir 正则表达式
正则表达式在 FreeBSD 上编译失败.
还要添加 /* -- */
标记来分隔给 PATTERNS()
宏的两个正则表达式条目,使其与其他内容类型的模式一致.
Git 2.27(2020 年第 2 季度)中添加了 Markdown 文档的 userdiff 模式.
参见 commit 09dad92(2020 年 5 月 2 日)Ash Holland (sersorrel
).
userdiff
:支持降价
通常可以在源代码旁边找到 Markdown 文档,并且为文档更改提供更好的上下文很有用;另请参见 commit 69f9c87d4(a> 列在 batch #1 中).
该模式基于 CommonMark 规范 0.29,第 4.2 节 https://spec.commonmark.org/ 但不匹配空标题,因为在大块标题中看到它们不太可能有用.
仅支持 ATX 标题,因为检测 setext 标题需要在模式匹配或匹配多行模式之前打印行.word-diff 模式与 HTML 模式相同,因为许多 Markdown 解析器都接受内联 HTML.
在 Git 2.30(2021 年第一季度)中,userdiff 模式学会了识别 POSIX shell 和 bash
中的函数定义.
请参阅 commit 2ff6c34(2020 年 10 月 22 日 https)维克多·恩马克 (l0b0
).
userdiff
:支持 Bash
支持 POSIX、bashism 和混合函数声明、所有四种复合命令类型、尾随注释和混合空格.
即使 Bash 允许函数名称中的语言环境相关字符,也只能检测具有POSIX.1-2017 为简单起见.
这应该涵盖绝大多数用例,并产生与系统无关的结果.
由于必须指定字型,但没有简单的方法可以知道默认字型,因此请使用默认的 IFS
字符作为起始符.以后的补丁可以改善这一点.
gitattributes
现在包含在其 手册页:
bash
适用于 Bourne-Again SHell 语言的源代码.
涵盖 POSIX shell 函数定义的超集.
在 Git 2.32(2021 年第二季度)中,方案"的用户差异模式已添加.
参见 commit a437390(2021 年 4 月 8 日)Atharva Raykar (tfidfwastaken
).
userdiff
:添加对 Scheme 的支持H2>为类似 Scheme 的语言添加一个 diff 驱动程序,它识别顶级和本地 define
形式,无论是函数定义、绑定、语法定义还是用户定义的 define-xyzzy
表单.
还支持 R6RS library
形式、module
形式以及 Racket (PLT Scheme) 中使用的类和结构声明.
替代def"也支持Gerbil Scheme中的语法,如defstruct、defsyntax等.
为大块头选择define
形式的基本原理是因为它通常是定义程序结构的唯一重要形式,并且具有局部函数定义是设计者的常见模式隐藏它们的可见性,因此感兴趣的不仅仅是顶级define
.
Schemers 还使用宏扩展了语言,以提供他们自己的定义形式(例如,类似 define-test-suite
之类的东西),它也在大块头中捕获.
由于使用诸如 module+
、class*
等形式的变体来扩展语法是一种常见做法,因此也支持这些变体.
正则表达式这个词是为了符合 R7RS(部分2.1) 有效的标识符、符号和数字.
gitattributes
现在包含在其 手册页:
scheme
适用于 Scheme 语言的源代码.
在 Git 2.33(2021 年第 3 季度)中,C# 的 userdiff 模式学习了令牌record
".
参见 commit c4e3178(2021 年 3 月 2 日),作者 Julian Verdurmen (304NotModified
).
userdiff
:添加对 C# 记录类型的支持
C# 9 中添加了记录
代码示例:
public record Person(string FirstName, string LastName);
有关详细信息,请参阅 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
在 Git 2.34(2021 年第 4 季度)中,java"的 userdiff 模式开始使用.语言已更新.
参见 commit a8cbc89(2021 年 8 月 11 日 Tassilo Horn (tsdh
).
userdiff
:改进java大块头正则表达式
目前,git diff
大块头显示如果方法具有限定返回类型、数组返回类型或泛型返回类型,则方法签名错误,因为正则表达式不允许使用点 (.)
, []
,或者返回类型中的 <
和 >
.
此外,无法匹配类型参数声明.
添加几个 t4018 测试,为不同的情况断言正确的大块头:
- 枚举常量变化
- 更改具有有界类型参数的泛型方法
- 使用通配符更改通用方法
- 嵌套类中的字段更改
而且,在 Git 2.34(2021 年第四季度)中,C++ 语言的用户差异模式已经更新.
参见 commit 386076e(2021 年 10 月 24 日),commit c4fdba3, 提交 637b80c,9commit bfaf102021 年 10 月)和 commit 350b87c、commit 3e063de, commit 1cf9384(2021 年 10 月 8 日) Johannes Sixt (j6t
).
例如:
userdiff-cpp
:允许数字-用数字分隔单引号
从 C++17 开始,单引号可以用作数字分隔符:
3.141'592'6541'000'0000xdead'beaf
让 cpp 驱动程序的 regex 这个词知道它,这样数字就不会在单引号处分成单独的标记.
When I use git diff
on a C# file, I see something like this:
diff --git a/foo.cs b/foo.cs
index ff61664..dd8a3e3 100644
--- a/foo.cs
+++ b/foo.cs
@@ -15,6 +15,7 @@ static void Main(string[] args)
string name = Console.ReadLine();
}
Console.WriteLine("Hello {0}!", name);
+ Console.WriteLine("Goodbye");
}
}
}
The hunk header line contains the first line of the current method (static void Main(string[] args)
), which is great. However it doesn't seem to be very reliable... I see many cases where it doesn't work.
So I was wondering, where does this excerpt come from? Does git diff
somehow recognize the language syntax? Is there a way to customize it?
The configuration is defined in .gitattributes
, section "Defining a custom hunk-header":
('csharp
' is part of the current built-in patterns)
Initially, the algorithm was quite crude for function name detection :
See commit acb7257 (Git 1.3.0, April 2006, authored by Mark Wooding)
xdiff
: Show function names in hunk headers.
It was refined with get_func_line(), itself coming from commit f258475 (Git 1.5.3, Sept 2007, authored by Junio C Hamano (gitster
))
You can see in that commit the test t/t4018-diff-funcname.sh
, to Test custom diff function name patterns.
Per-path attribute based hunk header selection.
The current xfuncname
syntax is introduced in commit 45d9414, Git 1.6.0.3, Oct. 2008, authored by Brandon Casey
diff.*.xfuncname
which uses "extended" regex's for hunk header selection
Finally, It has been expanded with commit 14937c2, for git 1.7.8 (December 2011), authored by René Scharfe.
diff
: add option to show whole functions as context
It is still being tweaked in Git 2.15 (Q4 2017)
Before 2.15, it was failing to match <h1>...</h1>
, while <h1 class="smth">...</h1>
matches.
See commit 9c03cac (23 Sep 2017) by Ilya Kantor (iliakan
).
A pattern to detect function boundary is called a xfuncref
.
See commit a807200 (08 Nov 2019) by Łukasz Niemier (hauleth
).
, for Git 2.25 (Q1 2020)
And:
See commit d1b1384 (13 Dec 2019) by Ed Maste (emaste
).
The userdiff patterns for Markdown documents have been added with Git 2.27 (Q2 2020).
See commit 09dad92 (02 May 2020) by Ash Holland (sersorrel
).
With Git 2.30 (Q1 2021), the userdiff pattern learned to identify the function definition in POSIX shells and bash
.
See commit 2ff6c34 (22 Oct 2020) by Victor Engmark (l0b0
).
gitattributes
now includes in its man page:
With Git 2.32 (Q2 2021), userdiff patterns for "Scheme" has been added.
See commit a437390 (08 Apr 2021) by Atharva Raykar (tfidfwastaken
).
gitattributes
now includes in its man page:
With Git 2.33 (Q3 2021), the userdiff pattern for C# learned the token "record
".
See commit c4e3178 (02 Mar 2021) by Julian Verdurmen (304NotModified
).
With Git 2.34 (Q4 2021), the userdiff pattern for "java" language has been updated.
See commit a8cbc89 (11 Aug 2021) by Tassilo Horn (tsdh
).
And, still with Git 2.34 (Q4 2021), userdiff patterns for the C++ language has been updated.
See commit 386076e (24 Oct 2021), commit c4fdba3, commit 637b80c, commit bfaaf19 (10 Oct 2021), and commit 350b87c, commit 3e063de, commit 1cf9384 (08 Oct 2021) by Johannes Sixt (j6t
).
For instance:
这篇关于git diff 大块头中的摘录来自哪里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!