git diff --name-only with ignore space 似乎被破坏了

git diff --name-only with ignore space seems to be broken

我有一个存储库,其中有许多文件只有 EOL 空白更改,但有些文件有实际更改。我正在尝试制作一个别名以仅打开 vim 选项卡中具有实际更改的文件的差异,作为其中的一部分,我正在 运行 宁一个 git diff --name-only ... 命令以获取列表已更改的文件,以便我可以在选项卡中打开它们。

我的问题是 --ignore-space-at-eol--ignore-space-change--ignore-all-space--name-only 组合时似乎什么都不做。

当我运行下面的命令没有打印出来(my_file有一个CR/LF变化):

git diff --ignore-space-at-eol my_file

但是当我 运行 我得到 my_file 打印出来:

git diff --ignore-space-at-eol --name-only my_file

有没有办法只获取没有空格更改的文件名?这对我来说似乎是一个错误,但我一直没能找到类似的问题。

我正在使用 git 版本 2.25.0

您将需要:

  • 先获取文件列表:git diff -–name-only
  • 然后对每个文件执行 git diff --ignore-space-at-eol my_file

但是如果您只想在有实际更改时执行第二个差异,请用测试包装第二个差异 (as in here), using the --quiet option:

if ! git diff --quiet --ignore-space-at-eol my_file; then
    git diff --ignore-space-at-eol my_file
fi

我最近碰巧遇到了类似的问题,还发现使用 --name-only 选项对 --ignore-all-space--ignore-blank-lines 都不起作用。

正如评论中有人指出的那样,这是由于 --name-only 仅检查文件是否已更改但未计算实际更改。我发现您可以改用 --stat 选项,因为这将计算对文件的实际更改。

因此,为了在忽略空白更改的同时获取已更改的文件列表,您可以使用如下内容:

git diff --stat --ignore-all-space --ignore-blank-lines --diff-filter=M <branchname>