Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用diff过滤器简化git status命令,例如git diff index_Git - Fatal编程技术网

如何使用diff过滤器简化git status命令,例如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

有没有一种方法可以在没有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 status
命令开始:

--cerial
(或
--cerial=v1
)输出格式是
--short
格式的一种非彩色编码变体,它为每个文件名打印两个字符,然后是一个空格,然后是文件名(可能根据
核心.quotePath
和名称中的字符引用)。
-s
产生较短的输出,但我们已经有了
--cerial=v1
输出,因此是冗余的(可能应该删除)

如果你处于冲突的合并中,这两个字符来自合并的每一个“边”,也就是说,与进程中的合并状态相比,更多的是与进程相关的。在这种情况下,您可以为这两个字符中的任何一个获取

U
条目。这与
git-diff-index
是不可复制的,而且对于
git-diff-file
至少有点困难;它需要读取索引中较高的阶段项,即la
git ls files-stage
,或
git diff files-1
git diff files-2
。(我没有尝试过
git diff文件-digit

但是,如果我们可以忽略此未合并的索引大小写,则两个字符是:

  • 在左边:
    HEAD
    vs index,A、D、M或R中的一个;或空白,或问号,这两种情况只有在右边的字符强制时才会出现
  • 右侧:索引与工作树,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]
因此,通过一些工作,可以获得“相同”的输出。我们希望:

  • 工作树中M-status文件的名称:
    git diff files--name only--diff filter=M

  • 索引中A或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