Git 为 cpp 文件定义不正确的 hunk header

Git Diff defining incorrect hunk header for cpp file

我正在使用 git diff 找出哪些方法发生了变化。显然它错误地定义了 hunk header(如下所示),因此我无法找到获取已更改方法列表的方法。


    @@ -22,7 +22,7 @@ void func2(){
     
     void func1(){
         cout<<"Function 1"<<endl;
    -    int i=1000;
    +    int i=100;
         while(i>0){
             func2();
             i--;

这里的变化是在 func1() 中,但是大块 header 在 func2() 中。我尝试更改一些测试功能,结果它总是选择所需功能上方的 line/function 作为大块头 header.

我尝试在根目录中创建一个 .gitattributes 文件并放置 *.cpp diff=cpp 以便为 diff 启用 cpp,不幸的是没有'解决问题。

这里的问题是函数 func2.

中的差异

注意 diff 以空行开头,后面是函数的定义 func1。此定义在 diff-hunk 内部,因此 diff-hunk 在 函数之前 开始。据推测,在空白行上方我们会找到更多 func2 的代码。这就是 git diff 告诉您的上下文:差异 之前 发生了什么。

可以(相当合理!)争辩说 中唯一的变化是在函数 func2 中,但是 Git 应该做什么一个 diff hunk,读取,例如:

 T f1() {
+    new_call();
     return somevalue;
 }
 T f2() {
-    old_call();
     return somevalue;
 }

这里,diff 在内部影响两个函数,f1f2。 Git 对“如何标记这个”的回答是从整个文本开始,向后搜索一些正则表达式。如果匹配 f0,那就是 diff 上的标签。

(旁注:内置的正则表达式工作得很好,但不能识别所有语言中所有可能的合法函数定义。更改显示的上下文数量应该有助于这个特定的例子,尽管你必须缩小它最多减少到 1 行。)