如何将git diff限制为仅一个目录,而不包含其子目录?

如何将git diff限制为仅一个目录,而不包含其子目录?,git,git-diff,Git,Git Diff,我使用git diff--name status跟踪在两次提交之间修改/添加/删除/重命名/复制了哪些文件,效果非常好 现在假设我将filefile1移动到newdir/file1,提交,然后运行git diff,我得到以下结果: $ git diff --name-status -C HEAD~1 HEAD R100 file1 newdir/file1 有没有办法让git将自己限制在给定目录中的更改列表中,而不是它的子目录?我想分别了解根目录和newdir目录的确切更改。对于n

我使用
git diff--name status
跟踪在两次提交之间修改/添加/删除/重命名/复制了哪些文件,效果非常好

现在假设我将file
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
选项来检测同一目录中的重命名和副本。

我知道这在git中可能是可行的,但我会尝试使用类似这样的filterdiff/grepdiff程序

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

将其传递给grep:

git diff --name-status HEAD..HEAD~1 . | grep ^[^/]*$
这将过滤掉包含子目录的任何内容,如果您需要从更深层的目录中获取某些内容,请执行以下操作:

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

如果您愿意,您可以很容易地将其命名为别名。

如果运行Linux或兼容的shell,并且有
find
可用,您可以使用
find
生成当前(或其他)目录中的非目录文件列表,然后将其馈送到
git diff
,例如:

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

git diff--name status
的输出不是一个补丁文件,而是一个修改过的文件列表,因此似乎
filterdiff
没有帮助。
git diff为我工作。