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
,以及可能的解决方法?
“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
也会产生错误。
它似乎是一些旧的操作模式遗留下来的。