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

为什么移动的代码在git diff中不着色?,git,git-diff,Git,Git Diff,我安装了最新的git,并将其配置为突出显示移动的代码: $ git config diff.colormoved default 下面是移动代码时的外观(请参见1->2) 但3-4不会突出显示为移动代码 以下是独立的更改: 参见git diff(1)中的--color moved/color moved文档: --颜色移动[=] 移动的代码行的颜色不同。它可以通过diff.colorMoved配置设置进行更改。如果未提供选项,则默认为no;如果未提供无模式选项,则默认为zebra。该模式必须

我安装了最新的git,并将其配置为突出显示移动的代码:

$ git config diff.colormoved default
下面是移动代码时的外观(请参见1->2)

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

以下是独立的更改:


参见git diff(1)中的
--color moved
/
color moved
文档:

--颜色移动[=]

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


  • 移动的线不会高亮显示

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

  • 普通的
    在一个位置添加而在另一个位置删除的任何行都将使用color.diff.newMoved着色。同样地 color.diff.oldMoved将用于添加的已删除行 在差异中的其他地方。此模式拾取任何移动的线,但 在审查中不是很有用 确定代码块是否在没有排列的情况下移动

  • 斑马
    贪婪地检测至少20个字母数字字符的移动文本块。使用以下两种方法之一绘制检测到的块: 颜色差异{旧的,新的}移动的颜色或 颜色差异{旧,新}移动替代。两者之间的变化 颜色表示检测到新块

  • 暗纹斑马
    与zebra类似,但会对移动代码中不感兴趣的部分执行额外的调光。两个相邻区块的边界线 被认为是有趣的,其余的则无趣

具体来说,默认值为
zebra
,并且它检测

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


<代码>我的$ctx=班次不包含至少20个字母数字字符。如果您使用
git diff--color moved=plain
,或在行尾添加
#十个ANs
,您的示例将突出显示为moved。

注意,还有一种情况是,彩色移动代码(当代码量足够时)会产生不适当的副作用:
git diff--color moved--cc--stat-p
”由于color moved中的一个bug与其他bug之间存在有趣的交互,因此无法正常工作

这已在Git 2.21(2019年2月)中修复

参见,,,,(2019年1月24日)by.
(于2019年2月5日合并)

差异:使用后清除发出的符号标志 当组合使用“
log--color moved
”时,会出现一个奇怪的错误 “
--cc--stat-p
”:合并提交的stat显示错误 随着下一次提交的差异

包含的测试说明了问题。
我们的历史是这样的:

A-B-M--D
   \ /
    C
当我们从
D
开始运行“
git log--cc--stat-p--color moved
”时,我们得到 这一系列事件:

  • D
    的diff正在使用
    -p
    ,因此
    diff\u flush()
    调用
    diff\u flush\u patch\u all\u file\u pairs()
    。在那里我们看到
    o->color\u移动了
    
    是有效的,因此我们将
    o->emissued\u符号
    指向一个静态本地 结构,导致
    diff\u flush\u patch()
    将符号排队,而不是 实际写出来。
    然后我们进行移动检测,发出符号,并清除 结构。但我们将
    o->发出的\u符号
    指向我们的结构

  • 接下来,我们计算
    M
    的差值。这是一个合并,所以我们使用 组合差异代码。
    查找路径\u generic()
    中,我们计算 每个提交及其父级之间的成对差异。通常这是 使用
    DIFF\u FORMAT\u NO\u输出完成,因为我们只是在寻找
    交叉路径。但是由于“
    --stat--cc
    ”显示第一个父级 stat,既然我们正在计算这个差异,我们启用 第一个父级的
    DIFF\u格式\u DIFFSTAT
    。这将输出stat 立即提供信息,避免我们运行单独的 第一个父项稍后会发生差异。
    但这一产出将流向何方?通常它直接进入标准输出, 但是因为设置了
    o->emissued\u符号
    ,所以我们将其排队。因此,我们 不要为合并提交打印diffstat,因为 这是错误的

  • 接下来,我们计算
    C
    的差值。我们实际上在展示一个补丁 同样,我们最终得到了
    diff\u flush\u patch\u all\u file\u pairs()
    ,但是 第2步的排队状态在结构中等待的时间。
    我们为
    C
    的diff添加新元素,然后刷新整个 事情我们将
    M
    中的
    diffstat
    作为
    C
    的diff的一部分,这是 错
  • 因此,触发bug确实需要所有这些因素的组合 这些选择


    Ryan的回答是正确的(未更改的颜色部分太短)。同样值得考虑的是,
    diff.colorMoved
    仍处于实验阶段;它可能会在将来的Git中更改。请注意:11000在[Git]标记中发布