如何避免git diff将代码块名称放入hunk header中?

时间:2011-12-23 09:15:03

标签: git

以下是使用git diff HEAD生成的差异文件的一些部分。

@@ -261,6 +261,13 @@ public class JSONServiceAction extends JSONAction {
                            return new double[0][0];
                    }
            }
+               /*
+                * Some changes made...
+                */
            else if (typeNameOrClassDescriptor.equals("[[F")) {
                    String[] values = request.getParameterValues(parameter);

@@ -587,4 +594,4 @@ public class JSONServiceAction extends JSONAction {
    private Map<String, Object[]> _methodCache =
            new HashMap<String, Object[]>();

-}
\ No newline at end of file
+}

我有两个问题:

  1. 查看hunk标题行,public class ...后面有@@。所以git diff将代码块名称(这里是类定义)放在hunk头中。 为什么git diff这样做?我可以问git diff不要把那部分放在大头标题中吗?
  2. 看看第二个大块部分。它显示了类文件的最后几行,根本没有修改。 为什么git diff在diff文件中包含此部分?我可以避免吗?(实际上,这个类的唯一修改部分是在第一个大块区域,我在else if之前添加了三行注释)
  3. 我检查了git diff手册页,但现在我仍然感到困惑,因为我不太了解手册的某些部分;我还检查了一些推荐的相关问题,但它们都是关于“如何在此处显示一个名称的方法名称”,如下所示:Is there a way to ask git diff to show the method name instead of the class name?

    如果没有禁用自定义大头的方法,请告诉我,以便我可以尝试使用某些脚本。

    更新:我希望关闭hunk说明的原因

    在我的工作中,基准测试,构建脚本中的一个步骤是自动收集源文件夹的代码库信息(如果它是svn工作副本) - 信息包含diff文件。现在我们希望它支持git。当然我们将保存一个纯git diff文件,但是,我们必须同时生成一个svn兼容的diff。这是因为开发人员使用git而QA(测试人员)使用svn(管理员只将经过审核的代码从git迁移到svn)。

    对于SVN客户端(SmartSVN,在我的工作环境中根本不聪明),diff文件是否具有某些SVN信息行并不重要。重要的是文件路径没有前缀,并且hunk标头没有描述...

3 个答案:

答案 0 :(得分:3)

  1. Git将这些块名称放在一起,以便人们更容易确定给定补丁影响的文件部分。在C的情况下,它显示了函数定义的第一行,这非常有用。显然,在Java的情况下,它的信息量略少。为什么会让你烦恼?
  2. 您在文件末尾添加或删除了换行符。 Git将其视为一种差异。因此它列在差异中。

答案 1 :(得分:2)

对于您的第2点,您有一个文件,在最后提交时没有换行符。您当前的版本最后有一个换行符(很多编辑为您添加一个)。这就是差异显示的内容。

$ git init
Initialized empty Git repository in ...
$ echo -n hello > file
$ git add file ; git commit -m test
[master (root-commit) 846c33e] test
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file
$ echo hello > file
$ git diff
showing.diff --git a/file b/file
index b6fc4c6..ce01362 100644
--- a/file
+++ b/file
@@ -1 +1 @@
-hello
\ No newline at end of file
+hello

对于你的1.,请参阅:Git format-patch to be svn compatible?

答案 2 :(得分:2)

  1. 如上所述,hunk标头是为了方便起见。如果要更改显示的内容,请参阅定义自定义hunk-header的git attributes联机帮助页部分,并查看python here的示例。如果您定义正则表达式以使其不匹配,那么您将无法获得hunk标头。在你这样做之前,我建议你确保你有充分的理由这样做。它不应该伤害任何东西,如果你自己解析差异,你应该能够接受标准的git差异。

  2. \ No newline at end of file指标是统一差异文件中的标准表示法,用于准确表示。