你如何获得差异中包含的文件列表?

时间:2010-10-16 09:14:22

标签: diff patch

我有一个包含git diff输出的补丁文件。我想得到根据补丁文件添加或修改的所有文件的摘要。我可以用什么命令来实现这个目标?

5 个答案:

答案 0 :(得分:14)

patchutils包含lsdiff实用程序。

答案 1 :(得分:2)

grep '+++' mydiff.patch似乎可以解决问题。

我也可以使用git diff --names-only这可能是更好的方法。

答案 2 :(得分:1)

grep '+++' mydiff.patch|perl -pe 's/\+\+\+ //g'

详细说明:

git diff以

格式生成输出
+++ b/file

所以,如果你使用grep作为Nathan建议

grep '+++' mydiff.patch

您将拥有受影响文件的列表,前缀为'+++'(3个加号和空格)。

我经常需要进一步处理文件,并且发现每行有一个文件名很方便,没有别的。这可以通过以下命令实现,其中perl / regex删除这些加号和空格。

grep '+++' mydiff.patch|perl -pe 's/\+\+\+ //g'

对于使用diff -Naur生成的补丁文件,mydiff.patch文件包含带有文件名和日期的条目(表示制表符空白字符)

+++ b/file<tab>2013-07-03 13:58:45.000000000 +0200

要为此提取文件名,请使用

grep '+++' mydiff.patch|perl -pe 's/\+\+\+ (.*)\t.*/\1/g'

答案 3 :(得分:0)

当您解析由git format-patch或其他包含有关已编辑行数的其他信息的补丁时,至关重要的是搜索^+++(在行的开头),而不仅仅是+++

例如:

grep '^+++' *.patch | sed -e 's#+++ [ab]/##'

将在开始时输出不包含a/b/的路径。

答案 4 :(得分:0)

一种不错的方法是使用--stat标志(或–summary标志,如果出于某种原因仅需要新的/删除的/重命名的文件)。

示例:

git apply --stat peer.diff | awk '{ print $1 }' | sed '$d'
1-js/03-code-quality/index.md
CONTR.md
LICENSE.md
README.md
chat-app.readme.md