【发布时间】:2018-05-20 23:54:27
【问题描述】:
有没有办法只列出已更改的目录?
如果我在 git root 说,~/project
我更改的文件是
~/project/subtool/file1
~/project/subtool/file2
~/project/subtool3/file1
我只是想要
~/project/subtool
~/project/subtool3
【问题讨论】:
标签: git
有没有办法只列出已更改的目录?
如果我在 git root 说,~/project
我更改的文件是
~/project/subtool/file1
~/project/subtool/file2
~/project/subtool3/file1
我只是想要
~/project/subtool
~/project/subtool3
【问题讨论】:
标签: git
您可以将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/
【讨论】:
git diff-tree 就是为此而构建的。 doit() { git diff-tree "$@" | awk '$1$2~/04/' | cut -f2-; }
-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'
此解决方案也适用于根目录中的文件:
git diff --name-only HEAD~1 | awk -F "/*[^/]*/*$" '{ print ($1 == "" ? "." : $1); }' | sort | uniq
根目录的更改将被列为.
git diff --dirstat=files,0 HEAD~1 的限制是它不显示根目录的变化。
【讨论】:
使用带有参数--dirstat的git diff,例如
git diff --dirstat HEAD~100..HEAD
【讨论】: