【问题标题】:git diff - only show which directories changedgit diff - 仅显示更改的目录
【发布时间】:2018-05-20 23:54:27
【问题描述】:

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

如果我在 git root 说,~/project

我更改的文件是

~/project/subtool/file1

~/project/subtool/file2

~/project/subtool3/file1

我只是想要

~/project/subtool

~/project/subtool3

【问题讨论】:

标签: git


【解决方案1】:

您可以将git-diff--dirstat 参数一起使用。

在您的场景中,假设您有以下提交:

$ git diff --name-status HEAD~1
M       subtool/file1
M       subtool/file2
M       subtool3/file1

它将产生以下输出:

$ git diff --dirstat=files,0 HEAD~1
  66.6% subtool/
  33.3% subtool3/

确保添加,0,否则git diff 默认只显示至少有3% 变化的目录。我还选择了files,因为这是计算成本最低的选项,而且您似乎并不关心具体的变化。

如果您能够使用sed,则可以去掉百分比值(您可能需要tweak the regular expression 来满足您的需要):

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

【讨论】:

  • 这非常完美!无论如何要避免输出 % 详细信息吗?我想将目录读入脚本并将其用于某事:wq
  • 如果您正在编写脚本,git diff-tree 就是为此而构建的。 doit() { git diff-tree "$@" | awk '$1$2~/04/' | cut -f2-; }
  • sed 正则表达式在 macOS 上对我不起作用。 BSD 与 2005 年 5 月 10 日的人 sed。
  • 在 zsh shell 中的 macOS 上,我必须将 -E 标志添加到 sed 命令并从 \+ 中删除正斜杠。这是我使用的:sed -E 's/^[ 0-9.]+% //g'
  • 通过管道输出到另一个sed 命令,您可以删除所有子文件夹名称,因此您只有顶级文件夹。 git diff --dirstat=files,0 HEAD~1 | sed -E 's/^[ 0-9.]+% //g' | sed -E 's/\/.*$//g'
【解决方案2】:

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

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

根目录的更改将被列为.

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

【讨论】:

  • 这会产生一些重复。如果我有 dir/foo/file-a 它显示 dir 和 dir/foo
【解决方案3】:

使用带有参数--dirstat的git diff,例如

git diff --dirstat HEAD~100..HEAD

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 2013-09-19
    • 2011-04-24
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多