我希望能够在 git diff 中显示后面没有添加的删除内容。 也就是说,仅显示后面没有
-
行的 +
行。这可能吗?
git diff | awk '/^@/{ if(s) print p; s = 1; p="" }
s == 1 && /^\+/ { s = 0 } 1 {p = sprintf("%s\n%s", p, $0)}
END { if (s) print p }' s=2
用一点黑魔法,是的。
我们需要明白这一点
git diff
列出文件、更改集、删除、添加以及它们周围的一些行
我们需要删除所有多余的行,以便我们只获取文件及其内部的更改,如下所示:
git diff | grep '^\(+++\|---\|-\|+\)'
编写一个程序,运行步骤 2 中的命令并显示结果。我知道这还不是解决方案,但您绝对需要首先执行此步骤,这样我们就知道输入和输出正在工作。
现在,让我们应用过滤。该算法将执行一个非常简单的过滤器
deletedLines <- empty
for each line
if (line starts with --- or +++) then add line to output
else if (line starts with -) deletedLines.add(line)
else
if (line starts with + but not with +++) then clear deletedLines
else add deletedLines to output
end for
另一种解决方案,在一行中,仅使用正则表达式。在这里,我使用
rg
,但任何支持多行匹配和逆匹配(分别为 -U
和 -v
)的 grep 工具都可以工作。
git diff | rg '^(\+ |- ).*' | rg -vU '^-(.*)\n\+(.*)\n'
git diff --numstat | grep "^0"
来自
git-diff
联机帮助页:
--numstat 选项提供 diffstat(1) 信息,但其设计目的是 以便更轻松地使用机器。 --numstat 输出中的条目看起来 像这样:
1 2 README 3 1 arch/{i386 => x86}/Makefile
即从左到右:
添加的行数;
一个选项卡;
删除的行数;
一个选项卡;
路径名(可能带有重命名/复制信息);
换行符。