为什么移动的代码没有在git diff中着色?

时间:2018-01-09 10:16:54

标签: git git-diff

我安装了最新的git并对其进行配置以突出显示移动的代码:

$ git config diff.colormoved default

以下是移动代码时的外观(请参阅1-> 2) enter image description here

但3-4不会突出显示为已移动的代码。

以下是独立更改:

enter image description here

2 个答案:

答案 0 :(得分:10)

请参阅git-diff(1)中--color-moved / colormoved的文档:

  

--color-moved[=<mode>]

     

移动的代码行的颜色不同。它可以通过diff.colorMoved配置设置进行更改。如果未给出选项,<mode>默认为no,如果没有给出模式,则zebra默认为zebra。该模式必须是以下之一:

     
      

  •   移动的线条不会突出显示。

  •   
  • 默认
         是斑马的同义词。这可能会在未来转变为更明智的模式。

  •   
  • <强>纯
         在一个位置添加并在另一个位置删除的任何行都将使用color.diff.newMoved进行着色。同样   color.diff.oldMoved将用于添加的已删除行   差异中的其他地方。此模式可以拾取任何移动的线,但它   在评论中不是很有用      确定是否在没有置换的情况下移动了代码块。

  •   
  • <强>斑马
         贪婪地检测至少20个字母数字字符的移动文本块。检测到的块使用   color.diff。{old,new}移动颜色或   color.diff {旧的,新} MovedAlternative。两者之间的变化   colors表示检测到新块。

  •   
  • <强> dimmed_zebra
         与zebra类似,但执行了移动代码的无趣部分的额外调暗。两个相邻块的边界线   被认为是有趣的,其余的都是无趣的。

  •   

具体而言,默认值为my $ctx = shift;并且检测到

  

至少20个字母数字字符的移动文本块

git diff --color-moved=plain不包含至少20个字母数字字符。如果您使用# ten more ANs或将Location Button添加到该行的末尾,则您的示例将突出显示为已移动。

答案 1 :(得分:0)

请注意,在另一种情况下,彩色移动代码(当代码量足够时)会产生不适当的副作用:
git diff --color-moved --cc --stat -p”无法正常运行,原因是色彩移动的错误与其余错误之间存在有趣的互动。

此问题已在Git 2.21(2019年2月)中修复

请参见commit dac03b5,请参见commit 04b19fccommit 8290faacommit 8817f0ccommit 48edf3acommit 426fd36Jeff King (peff)(2019年1月24日) 。
(由Junio C Hamano -- gitster --commit 5d2710b中合并,2019年2月5日)

  

diff:使用后清除emitted_symbols标志

     

将“ log --color-moved”与组合使用时会出现一个奇怪的错误   --cc --stat -p中的错误:合并提交的状态错误地显示   与 next 提交的差异。

     

包含的测试演示了该问题。
  我们的历史看起来像这样:

A-B-M--D
   \ /
    C
     

当我们从git log --cc --stat -p --color-moved开始运行“ D”时,我们得到   事件的顺序:

     
      
  1. D的差异使用-p,因此diff_flush()调用了    diff_flush_patch_all_file_pairs()。在那里,我们看到o->color_moved    有效,因此我们将o->emitted_symbols指向静态本地    结构,导致diff_flush_patch()排队符号而不是    实际写出来。
       然后,我们进行移动检测,发出符号并清除    结构。但是我们让o->emitted_symbols指向我们的结构。

  2.   
  3. 接下来,我们计算M的差异。这是合并,因此我们使用    组合的差异代码。
       在find_paths_generic()中,我们计算    每个提交及其父级之间的成对差异。通常这是    DIFF_FORMAT_NO_OUTPUT完成,因为我们只是在寻找    相交的路径。但是,由于“ --stat --cc”显示了第一祖父母    统计信息,并且由于我们无论如何都要计算差异,因此我们启用了    DIFF_FORMAT_DIFFSTAT为第一位父母。输出状态    立即获取信息,使我们免于单独运行    第一次父母的差异稍后。
       但是那个输出去了哪里?通常它直接进入标准输出,    但是由于设置了o->emitted_symbols,因此我们将其排队。结果,我们    实际不打印合并提交的diffstat(尚未),这    是错误的。

         
        
    1. 接下来,我们计算C的差异。我们实际上正在展示一个补丁   再次,所以我们以diff_flush_patch_all_file_pairs()结尾,但这   我们将第2步中排队的统计信息等待在结构中。
        我们为C的差异添加新元素,然后刷新整个   事情。我们将diffstat中的M视为C的差异的一部分,   错误。
    2.   
  4.   
     

所以触发错误确实需要结合所有   这些选项。