17

git diff例如中的某些选项--name-status会导致在文件名旁边输出状态字母。他们是:

A、C、D、M、R、T、U、X、B

……他们的意思是

添加(A),复制(C),删除(D),修改(M),重命名(R),类型(即常规文件,符号链接,子模块,...)更改(T),未合并(U),未知(X ),或配对损坏 (B)。

问题:X和状态应该如何B解释,哪些情况会导致它们的出现?您能否提供导致此类状态出现在 的输出中的一系列步骤git-diff,以及可能的解决方法?

4

1 回答 1

18

B破对”状态永远不会直接出现在--name-status输出中,它仅--diff-filter在使用选项-B( --break-rewrites) 时作为选项的参数有用。将其用作过滤器会选择至少有一定比例的内容被删除或更改的文件。

这种“中断”并不是非常有用,--name-status因为“中断”的目的主要是改变 diff 文本的生成方式:它从 diff 输出中消除上下文行(未更改的行),而不是生成添加和删除行需要围绕 diff 算法碰巧找到的任何“随机”公共子序列。

git init broken-pairs
cd broken-pairs
nums() { seq "$1" "$2" 2>/dev/null || jot $(($2 - $1 + 1)) "$1"; }
nums   0  99 > a
nums 100 199 > b
git add a b
git commit -ma=0-99,b=100-199
nums 200 299 > a
{ nums 100 149; nums 350 399; } > b
git diff --name-status --diff-filter=B             # selects nothing
git diff --name-status --diff-filter=B -B          #         M100    a
git diff --name-status --diff-filter=B -B/50       #         M100    a M050    b

X未知”状态不应该真正出现。如果确实出现,则意味着路径名既没有取消合并、添加、删除、修改,也没有更改其类型(实际上:未更改)意外地进入了内部差异机制的核心;feeding unmodified <pathname> to diffcore也会产生错误。

它似乎是一些旧的操作模式遗留下来的。

于 2011-05-20T07:19:19.603 回答