如何将git-diff限制在一个目录内,不包括其子目录?

14

我使用git diff --name-status来追踪在两个提交之间哪些文件已经被修改/添加/删除/重命名/复制,效果很好。

现在假设我将文件file1移动到newdir/file1,提交后运行git diff,我会得到以下结果:

$ git diff --name-status -C HEAD~1 HEAD
R100    file1    newdir/file1
有没有一种方法可以让Git仅限于给定目录内的更改列表,而不包括其子目录?我想知道根目录和newdir目录的确切更改情况,分别获取。对于newdir来说,这很容易:
$ git diff --name-status -C HEAD~1 HEAD -- newdir
A       newdir/file1

...但我如何在根目录中获得“互补”的差异信息?也就是说,这个输出:

$ git diff ???
D       file1

请注意,我想保留-C选项,以便在同一个目录中检测重命名和复制。

3个回答

1
将其传递到grep:
git diff --name-status HEAD..HEAD~1 . | grep ^[^/]*$

这将过滤掉包含子目录的任何内容,如果您需要从更深的目录中获取某些内容,请执行以下操作:

git diff --name-status HEAD..HEAD~1 <path> | grep ^<path>[^/]*$

如果需要的话,您可以轻松地创建别名。


git diff <branchA>..<branchB> -- <path> 对我很有用。 - sholsinger

1

我知道在 Git 中可能可以实现,但我倾向于使用 filterdiff/grepdiff 程序来自 patchutils,类似这样的操作应该可以正常运行。

git diff -C .... | filterdiff --clean -x '*/*/**'

git diff --name-status 命令的输出结果不是一个补丁文件,而只是一个修改过的文件列表,因此似乎 filterdiff 无法帮助。 - Jean-Philippe Pellet

0

如果运行具有可用find的Linux或兼容shell,则可以使用find生成当前(或其他)目录中非目录文件的列表,然后将其提供给git diff

git diff --stat --other-git-diff-args -- $(find . -type f -depth 1 -print0 | tr '\0' ' ')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接