如何使用Git仅列出发生变更的目录?
列出Git中变更文件所在的目录
针对你提到的场景——在Git根目录~/project下修改了subtool/file1、subtool/file2和subtool3/file1,想要只输出变更的目录subtool和subtool3,这里有几个实用的命令方案:
方案1:针对未暂存的修改
如果你还没执行git add暂存这些修改,直接用这条命令:
git ls-files -m | awk -F '/' '{print $1}' | sort -u
拆解各部分作用:
git ls-files -m:列出所有本地已修改但未暂存的文件路径;awk -F '/' '{print $1}':把每个文件路径按斜杠/拆分,提取第一个部分(也就是根目录下的子目录名);sort -u:对结果排序并去重,确保每个目录只显示一次。
方案2:针对已暂存的修改
如果你已经执行git add把修改暂存了,就换成这条命令:
git diff --cached --name-only | awk -F '/' '{print $1}' | sort -u
这里git diff --cached --name-only会列出所有已暂存但未提交的文件路径,后续的处理和方案1一致。
方案3:同时覆盖暂存和未暂存的修改
如果想一次性获取所有已修改(不管有没有暂存)的文件所在目录,用这个组合命令:
(git ls-files -m; git diff --cached --name-only) | awk -F '/' '{print $1}' | sort -u
通过括号把两个命令的输出合并,再统一处理去重,就能得到所有变更目录的列表。
额外小提示
如果你的项目里有根目录直接修改的文件(比如~/project/readme.md),上面的命令会输出空行。如果想过滤掉这种情况,可以在awk环节加个判断:
... | awk -F '/' '{if($1 != "") print $1}' | sort -u
内容的提问来源于stack exchange,提问作者Nishant Roy
相关产品推荐
相关产品推荐

