代码之家  ›  专栏  ›  技术社区  ›  Silveri

使用git word diff时隐藏未更改的行

  •  1
  • Silveri  · 技术社区  · 6 年前

    我有两个文件, old.txt :

    Line 1
    Line 2
    Line 3
    Line4
    Line5
    Line 7
    Line 7
    Line 8
    

    new.txt :

    Line 1
    Line 2
    Line 3
    Line 4
    Line 5
    Line 6
    Line 7
    Line 8
    

    如果我跑 git diff --no-index --word-diff-regex=. old.txt new.txt 然后它显示,唯一的更改是第4行和第5行的空白修复以及第6行的错误编号修复:

    diff --git a/old.txt b/new.txt
    index be8495f..a982fdc 100644
    --- a/old.txt
    +++ b/new.txt
    @@ -1,8 +1,8 @@
    Line 1
    Line 2
    Line 3
    Line{+ +}4
    Line{+ +}5
    Line [-7-]{+6+}
    Line 7
    Line 8
    

    不幸的是,它还显示了未更改的行(1到3、7和8),但是可以通过删除 --unified=0 ,例如。 git diff --no-index --unified=0 --word-diff-regex=. old.txt new.txt :

    diff --git a/old.txt b/new.txt
    index be8495f..a982fdc 100644
    --- a/old.txt
    +++ b/new.txt
    @@ -4,3 +4,3 @@ Line 3
    Line{+ +}4
    Line{+ +}5
    Line [-7-]{+6+}
    

    然而,在diff regex这个词已经被定制为忽略空白差异的情况下,例如。 git diff --no-index --unified=0 --word-diff-regex="[^[:space:]]" old.txt new.txt ,显示:

    diff --git a/old.txt b/new.txt
    index be8495f..a982fdc 100644
    --- a/old.txt
    +++ b/new.txt
    @@ -4,3 +4,3 @@ Line 3
    Line 4
    Line 5
    Line [-7-]{+6+}
    

    请注意,第4行和第5行现在没有显示任何更改,但仍显示在输出中。这可能是因为与第1行到第3行不同,这些行并不完全相同。

    但是有没有 git 根据单词diff regex,当行不变时不显示行的选项?

    2 回复  |  直到 6 年前
        1
  •  1
  •   torek    6 年前

    没有这样的选择,但也许应该有。正如您所猜测的,Git实际上是逐行执行diff,然后在结果上叠加word-to-word编辑指令。当这个词的定义导致“没有变化”时,你就得到了你所看到的。

    (或者,单词diff可以使用单词作为输入到内部diff引擎的实际符号。但这将导致更大的输入,而Myers算法是O(N D),因此随着N和D都增加,这将需要更多的时间。)

        2
  •  0
  •   Silveri    6 年前

    最后我用了 grep 通过查找 {+ [- 使用表达式 grep -E "\{\+|\[-" ,例如。

    git diff --no-index --unified=0 --word-diff-regex="[^[:space:]]" old.txt new.txt | grep -E "\{\+|\[-"
    

    哪些输出:

    Line [-7-]{+6+}
    

    这不会提供一个有效的补丁文件作为输出,但它对我来说足够好,这样我就可以直观地比较一些大文件之间的更改。