当我做一个git diff时,它会显示已添加的行:
+ this line is added
Run Code Online (Sandbox Code Playgroud)
已删除的行:
- this line is removed
Run Code Online (Sandbox Code Playgroud)
但它也显示了许多未修改的行:
this line is not modified
this line is also not modified
Run Code Online (Sandbox Code Playgroud)
这导致实际的git diff看起来像这样:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Run Code Online (Sandbox Code Playgroud)
我可以要求git只显示已修改的行并忽略所有其他未修改的代码吗?我写了一个方法,它将删除所有在它们前面没有"+"或" - "符号的行,但我相信必须有一个更简单的方法来执行此操作.
在我的git diff中,我只对看到已修改的行感兴趣.
提前致谢.
Chr*_*yes 150
What you want is a diff with 0 lines of context. You can generate this with:
git diff --unified=0
Run Code Online (Sandbox Code Playgroud)
or
git diff -U0
Run Code Online (Sandbox Code Playgroud)
You can also set this as a config option for that repository:
git config diff.context 0
Run Code Online (Sandbox Code Playgroud)
To have it set globally, for any repository:
git config --global diff.context 0
Run Code Online (Sandbox Code Playgroud)
use*_*654 31
另劈(关于联合国*X),以显示只是开始的行+
和-
:
git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'
Run Code Online (Sandbox Code Playgroud)
上面的代码执行以下操作:
git diff -U0
:选择0上下文行+
or 开头的所有行-
--- a/
或开头的行+++ b/
注: -上述解决方案将需要被修改,如果你使用其他git的差异选项,如-R
,--src-prefix
,--dst-prefix
,--no-prefix
,... -这两个里grep可以组合成一个单一的grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
,但我觉得双grep的版本更容易理解.
关注Chris的最新评论,后处理的主要问题是你想要保持行开头,-|+
但你也想要过滤掉那些开头的行---|+++
.另一方面,如果你在你的仓库中存储补丁文件(我在Pydoop中),你想要保留以开头的行--|++
,所以regexp变得有点涉及:
git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'
Run Code Online (Sandbox Code Playgroud)
正则表达式使用负向前瞻:请参阅Peter Boughton 对此问题的回答以获得详细解释.
如果经常这样做,您可能想为它设置一个git别名:
git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'
Run Code Online (Sandbox Code Playgroud)
我认为对于简单的情况,正则表达式可以更短更容易记住,但需要注意的是,如果您在行本身以+
或-
$ git diff | grep '^[+|-][^+|-]'
Run Code Online (Sandbox Code Playgroud)
正则表达式表示该行应以+
or开头,-
紧随其后的字符不应是这两者之一。无论我是否+
在这里逃脱,我都得到了相同的结果,顺便说一句...
例子:
$ cat testfile
A
B
C
D
E
F
G
Run Code Online (Sandbox Code Playgroud)
说我的变化C
来X
,E
来Y
,并G
到Z
。
$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z
Run Code Online (Sandbox Code Playgroud)
不过,就像我上面说的,这仅适用于大多数情况。如果您将该输出通过管道传输到文件dout
,然后尝试使用相同的正则表达式,它将不起作用。
$ git diff dout | grep '^[+|-][^+|-]'
$
Run Code Online (Sandbox Code Playgroud)
无论如何,希望对您的情况有所帮助
归档时间: |
|
查看次数: |
37196 次 |
最近记录: |