我试图只获得已更改的新版本的行,而不是git diff所显示的所有其他信息。
有关:
git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix
它显示:
diff --git file1 file2
index d9db605..a884b50 100644
--- file1
+++ file2
@@ -16 +16 @@ bla bla bla
-old text
+new text
我想看的只是:
new text
有可能吗?
答案 0 :(得分:13)
只有添加的行在所有情况下都没有意义。如果你替换了一些文本块并且你发生了包含之前存在的单行,那么git必须匹配并猜测。 - 通常git diff
的输出可以在之后用作patch
的输入,因此是有意义的。只有添加的行没有精确定义,因为在某些情况下git必须猜测。
如果你仍然想要它,你就不能单独信任一个领先的+
标志。也许过滤所有的绿线更好:
git diff --color=always|perl -wlne 'print $1 if /^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/'
仅对已删除的行过滤所有红线:
git diff --color=always|perl -wlne 'print $1 if /^\e\[31m-(.*)\e\[m$/'
检查您可以使用的输出中的颜色代码:
git diff --color=always|ruby -wne 'p $_'
答案 1 :(得分:6)
如果您只想要new text
部分,请使用以下内容:
git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix | egrep "^\+"
这基本上是你的代码,用正则表达式传递到egrep
命令。正则表达式只会过滤以加号开头的行。
答案 2 :(得分:2)
您可以使用:
git diff -U0 <commit-hash> | grep "^\+\""
这会将您的输出设为&#34; +新文字&#34;
答案 3 :(得分:1)
如果您希望该过程是自动的,对于单个文件,您可以使用 diff
而不是 git diff
,这样做:
diff --changed-group-format='%>' --unchanged-group-format='' <( git show HEAD:myfile.ext ) myfile.ext
diff
使用 git show HEAD:myfile.ext
的结果作为第一个输入--changed-group-format='%>'
告诉 diff 输出添加的行--unchanged-group-format=''
告诉 diff 对于删除的行不输出任何内容要获取提交的信息(不是当前工作树修改的信息),您甚至可以这样做
diff --changed-group-format='%>' --unchanged-group-format='' <( git show _SHA_~:myfile.ext ) <( git show _SHA_:myfile.ext )
其中 _SHA_
是对提交的任何引用(SHA、分支、标签等)
(对于那些想知道我为什么需要这个的人:我有一个“update.sql”文件,其中放置了所有 SQL 语句。因此,在项目更新时,我必须找到添加了哪些行,让Mysql执行它们)。
我在 this answer
中找到了这些差异选项答案 4 :(得分:0)
以下是使用grep
的答案。它保留了原始的红色/绿色以提高可读性。我提供了几种语法变化:
git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'
说明:
git diff --color
是必需的,以防止git在进行配管时禁用颜色。grep --color=never
防止grep突出显示匹配的字符串(这会从原始命令中删除原始颜色)\e[31m
或绿色(\e[32m
)开头的行转义码。$'...'
(ANSI-C引用语法)或-P
(perl语法)是让grep
将\e
或\033
解释为{ {1}}个字符。答案 5 :(得分:0)
不幸的是,颜色的东西对 Windows 来说不是那么便携(使用 unxutils 支持的命令)。但是有一个解决方案可以解决使用颜色模式解决的+++问题。
此外,我们可能也不想要主角。所以一旦我们匹配到它,让我们使用 sed 来摆脱它:
git diff --no-ext-diff --unified=0 -a --no-prefix --output-indicator-new=% | sed -n "s/^%\(.*\)$/\1/p"
如果你想删除行:
git diff --no-ext-diff --unified=0 -a --no-prefix --output-indicator-old=% | sed -n "s/^%\(.*\)$/\1/p"
通过将 % 替换为 +,您不必担心以 +++ 开头的标题行(b/c git 没有在那里使用该前缀......但是这可能会改变,这仍然是一个瓷器命令)
前缀字符必须是 ASCII(所以不要对 unicode 感兴趣)。鉴于 Windows/Linux/sed 语法的变幻莫测。我认为,唯一不需要在某处转义的 ASCII 字符是:%,_~
根据您的需要,您可能希望删除 -a
,因为二进制文件可能会把事情弄得一团糟。
--exit-code
是一个 noop。通过管道运行,我们只能得到第二个退出代码(在 Windows 和 Linux 上都测试过)