12

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

现在假设我将文件移动file1newdir/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在同一目录中检测重命名和副本的选项。

4

3 回答 3

1

我知道它在 git 中可能是可行的,但我很想使用来自patchutils的 filterdiff/grepdiff 程序,这样的东西应该可以

git diff -C .... | filterdiff --clean -x '*/*/**'
于 2011-05-25T18:59:19.707 回答
1

将其传递给 grep:

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

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

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

如果你愿意,你可以很容易地给它起别名。

于 2011-06-25T23:36:18.130 回答
0

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

git diff --stat --other-git-diff-args -- $(find . -type f -depth 1 -print0 | tr '\0' ' ')
于 2019-12-01T05:27:34.853 回答