如何使用diff过滤器简化git status命令,例如git diff index
有没有一种方法可以在没有grep和sed的情况下编写以下命令 我认为这可以通过使用git diff index实现,但我被细节所淹没 原始命令是:如何使用diff过滤器简化git status命令,例如git diff index,git,Git,有没有一种方法可以在没有grep和sed的情况下编写以下命令 我认为这可以通过使用git diff index实现,但我被细节所淹没 原始命令是: git status -s --porcelain /some/path | grep -E '^(.M|[MA].|\?\?)' | sed -e 's/^.. //g'; 是否等同于此 git diff-index --name-only --diff-filter=AM HEAD -- /some/path 那么,让我们从下面的git st
git status -s --porcelain /some/path | grep -E '^(.M|[MA].|\?\?)' | sed -e 's/^.. //g';
是否等同于此
git diff-index --name-only --diff-filter=AM HEAD -- /some/path
那么,让我们从下面的
git status
命令开始:
--cerial
(或--cerial=v1
)输出格式是--short
格式的一种非彩色编码变体,它为每个文件名打印两个字符,然后是一个空格,然后是文件名(可能根据核心.quotePath
和名称中的字符引用)。-s
产生较短的输出,但我们已经有了--cerial=v1
输出,因此是冗余的(可能应该删除)
如果你处于冲突的合并中,这两个字符来自合并的每一个“边”,也就是说,与进程中的合并状态相比,更多的是与进程相关的。在这种情况下,您可以为这两个字符中的任何一个获取
U
条目。这与git-diff-index
是不可复制的,而且对于git-diff-file
至少有点困难;它需要读取索引中较高的阶段项,即lagit ls files-stage
,或git diff files-1
和git diff files-2
。(我没有尝试过git diff文件-digit
)
但是,如果我们可以忽略此未合并的索引大小写,则两个字符是:
- 在左边:
vs index,A、D、M或R中的一个;或空白,或问号,这两种情况只有在右边的字符强制时才会出现HEAD
- 右侧:索引与工作树,A、D、M、R、空白或问号中的一个
C
,作为一种可能的状态。这种状态可能来自Git的内部差异引擎,但只有在启用复制查找的情况下,Git status
命令本身在默认情况下不启用复制查找,至少目前没有指示它这样做的标志,因此C
状态永远不会起作用。)(有时发生。)
当文件同时出现在两个被比较的实体中时,会出现空白,并且在两个实体中都是相同的。如果文件F同时出现在两个头中(提交)而索引,在两者中都是相同的,例如,它的左手字符状态是空的。但是,如果F同时出现在索引树和工作树中,并且它的状态在两者中都是相同的,git status
根本没有提到它,所以你永远不会得到两个空格。这就是为什么我说只有在强制时才会出现空白
当文件以未跟踪文件的形式存在于工作树中时,会出现问号状态。根据定义,在这种情况下,文件不在索引中:未跟踪文件是出现在工作树中但不在索引中的文件。因此,在这种情况下,您得到的是一行,它读取??filename
。请注意,在这种情况下,它是可能的e指定的文件确实出现在HEAD
中。如果这是真的,则必须在HEAD
-vs index中删除它。人们可能会认为这可能会出现如下情况:
D? filename
这是有道理的,但是Git显示如下:
D filename
?? filename
i、 例如,该文件出现两次,一次是头部vs索引=已删除状态(与工作树没有区别),另一次是索引vs工作树=未跟踪状态(显示两个问号)
现在让我们转到grep
。-E
参数提供了一个正则表达式,该正则表达式匹配三个选项中的一个,所有选项都锚定在行的开头,因此我们总是查看两个git status
字符。三个表达式选项是:
.M
:索引与工作树状态表示已修改的任何内容。第一个点接受任何头与索引状态
[MA]。
:头与索引状态表示修改或添加的任何内容。第二个点接受任何索引与工作树状态
??
:未跟踪的文件
我认为这可以通过使用git diff index
实现
正如我所说,这
将树与工作树或索引进行比较
因此,假设HEAD
作为比较左侧的树,而说明符use the working tree作为右侧,这将运行与git status
前半部分相同的比较
git diff-index --cached HEAD [options]
与git status
的前半部分相同,可以获得与git status--short
左侧的字母代码相同的代码
但是,要获得与git status--short的右半部分中的字母代码相同的代码,您必须将索引本身(而不是树)与工作树进行比较。这就是原因。因此,您需要:
git diff-files [options]
因此,通过一些工作,可以获得“相同”的输出。我们希望:
git diff files--name only--diff filter=M
git diff index--name only--diff filter=AM
git diff-*
命令中的任何一个来完成,但可以用git ls文件--other--exclude standard
(您需要最后一个选项,以使其遵守通常的git ignore规则)(
git diff-files --name-only --diff-filter=M
git diff-index --name-only --diff-filter=AM
git ls-files --other --exclude-standard
)
作为一个由三个命令组成的组,您应该使用相同的文件名。这里的主要问题是,如果一个文件在索引中同时具有a
-或M
-和在工作树状态下具有M
,并且您按如下顺序运行这三个命令,您将看到该文件两次。您可以通过使用管道结束命令序列来解决这个问题ode>排序-u:
(...) | sort -u
但是请注意,git状态--proce
(...) | sort -u