【问题标题】:What is the effect of git diff-files --diff-filters=A?git diff-files --diff-filters=A 的作用是什么?
【发布时间】:2018-06-10 21:05:21
【问题描述】:

git-diff-files(1) 的文档说

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

但是,以下命令不会显示添加的文件(不要在具有 origin 子目录的目录中运行此命令):

start=$PWD
origin="$start/origin"

rm -rf $origin
mkdir $origin
cd $origin
touch 1.txt
echo "2" > 2.txt
git init
git add -A
git commit -m "init"

echo "1" > 1.txt
rm 2.txt
echo "3" > 3.txt
git diff-files --diff-filter=ADM

输出如下:

$ git diff-files --diff-filter=ADM
:100644 100644 e69de... 0000... M      1.txt
:100644 000000 0cfbf... 0000... D      2.txt

git diff-files 是否从不显示添加的文件? diff-filter 选项表明它能够选择添加的文件。

【问题讨论】:

  • 我认为1.txt2.txt 他们的D/M 状态会覆盖A 状态。 3.txt 根本没有添加,它是未跟踪的文件。
  • 我承认在这种情况下,3.txt 未被跟踪。我将“未跟踪”表示不在索引中的文件(由git ls-files -o 列出的文件)。尽管指令的文本暗示 --diff-filter=A 将显示3.txt,因为它在工作树和索引的区别在于,相对于索引,工作树中的文件是“添加”的。简而言之,git diff-files在什么情况下会将文件显示为“A”?
  • 我以为你需要git add 3.txt,但我自己尝试过,但我自己无法获得A 的状态。

标签: git


【解决方案1】:

确实git diff-files 永远不会显示添加的文件。

diff-files 命令显示索引和工作副本中的文件之间的差异。根据定义,尚未添加到索引的文件(通过git add)不会成为索引的一部分,因此不会出现在索引和工作副本之间的任何差异中。只需将文件添加到索引中,就会使索引和工作副本中的文件相同,因此索引和工作副本之间没有任何区别,因此也不会显示在 diff-files 中。修改工作副本中添加的文件将直接导致M 状态。

文档显示所有可能的--diff-filter 参数的原因是差异选项文档在所有采用差异选项的命令之间共享(diff-filesdiff-indexdiff-treeformat-patchlogshow)。他们各自的文档仅包含diff-options 文档:

include::diff-options.txt[]

this line of the git-diff-files documentation source 为例。普通的diff-options 拥有共享的--diff-filter 文本starting here

由于这些文件是在构建文档时处理的,正如条件所证明的那样

ifndef::git-format-patch[]

--diff-filter 文档上方的行中,可以想象diff-files 命令的文本可能会有所不同(或增加以说明某些参数不适用的事实)。针对此更改向 git 项目打开错误报告可能是有意义的。

【讨论】:

  • 很好的答案。没想到看source git source code来理解文档。确实,我从来没有想过使用代码来生成文档。
  • 还有this is 人们如何使用git log --diff-filter=A 来查找文件的创建位置。
猜你喜欢
  • 2011-10-09
  • 2015-11-28
  • 2023-03-28
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
相关资源
最近更新 更多