git diff - 仅显示更改的目录

Nis*_*Roy 5 git

有没有办法只列出已更改的目录?

如果我在git root说, ~/project

我改变的文件是

~/project/subtool/file1

~/project/subtool/file2

~/project/subtool3/file1

我只是想

~/project/subtool

~/project/subtool3

Mar*_*vin 11

你可以使用git-diff--dirstat参数.

在您的方案中,假设您有以下提交:

$ git diff --name-status HEAD~1
M       subtool/file1
M       subtool/file2
M       subtool3/file1
Run Code Online (Sandbox Code Playgroud)

它会产生以下输出:

$ git diff --dirstat=files,0 HEAD~1
  66.6% subtool/
  33.3% subtool3/
Run Code Online (Sandbox Code Playgroud)

确保添加,0,否则git diff默认情况下仅显示至少3%更改的目录.我也选择了,files因为这是计算上最便宜的选择,你似乎并不关心具体的变化.

如果你能够使用sed你可以摆脱百分比值(你可能想要调整一下正则表达式以满足你的需要):

$ git diff --dirstat=files,0 HEAD~1 | sed 's/^[ 0-9.]\+% //g'
subtool/
subtool3/
Run Code Online (Sandbox Code Playgroud)

  • 通过将输出传输到另一个“sed”命令,您可以删除所有子文件夹名称,这样您就只有顶级文件夹。`git diff --dirstat=文件,0 HEAD~1 | sed -E 's/^[ 0-9.]+% //g' | sed -E 's/\/.*$//g'` (4认同)
  • 如果你正在编写它,`git diff-tree` 就是为此而构建的。`doit() { git diff-tree "$@" | awk '$1$2~/04/' | 切-f2-; }` (2认同)
  • sed 正则表达式在 macOS 上对我不起作用。BSD sed 与 man 日期为 2005 年 5 月 10 日。 (2认同)
  • 在zsh shell中的macOS上,我必须在`sed`命令中添加`-E`标志,并从'\ +`中删除正斜杠。这就是我使用的:`sed -E's / ^ [0-9。] +%// g'` (2认同)

Lar*_*ari 6

此解决方案也适用于根目录中的文件:

git diff --name-only HEAD~1 | awk -F "/*[^/]*/*$" '{ print ($1 == "" ? "." : $1); }' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

根目录中的更改将列为 .

的限制git diff --dirstat=files,0 HEAD~1是它不显示根目录中的更改。


jpb*_*chi 5

xargs这是使用and代替ordirname之类的替代方法。sedawk

\n
git diff HEAD~1 --name-only | xargs dirname | sort | uniq\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. git diff \xe2\x80\xa6将列出修改的文件路径。
  2. \n
  3. | xargs dirname会将文件路径转换为目录路径。
  4. \n
  5. | sort | uniq将删除重复项。
  6. \n
\n

.请注意,如果您修改了存储库根目录中的任何文件,这将生成一行。

\n


Xyp*_*ron -2

使用 git diff 和参数 --dirstat,例如

git diff --dirstat HEAD~100..HEAD
Run Code Online (Sandbox Code Playgroud)