如何同时获取暂存区和未暂存区的文件列表(包括新增和修改文件)?

git 获取修改文件和新增文件列表(不包过删除文件)

git ls-files 命令

git ls-files --others --exclude-standard    // 获取新增文件列表
git ls-files --modified --exclude-standard  // 获取修改文件列表
git ls-files --deleted --exclude-standard   // 获取删除文件列表

没有添加到暂存区上面的命令是正常的,添加到暂存区获取不到对应的文件。

需要实现一下功能:
1.获取修改文件列表(不包括删除文件);
2.获取新增文件列表;
3.文件是否在暂存空间,都能获取到文件列表(暂存空间文件和未暂存空间文件重复去重);

已暂存

git diff --name-only --cached                  // 获取暂存区所有文件
git diff --name-only --cached --diff-filter=A  // 获取新增文件
git diff --name-only --cached --diff-filter=D  // 获取删除文件
git diff --name-only --cached --diff-filter=M  // 获取修改文件
git diff --name-only --cached --diff-filter=d  // 排除删除文件

--diff-filter 参数:
A:新增文件
D:已删除文件
M:修改过文件
小写字母取反;

未暂存

git ls-files --exclude-standard --others    // 新增
git ls-files --exclude-standard --modified  // 修改
git ls-files --exclude-standard --deleted   // 删除

git ls-files --exclude-standard --others --modified 获取未暂存区新增修改文件,但是包括了删除的文件。

取差集命令 comm

comm [-123][--help][--version][第1个文件][第2个文件]

参数:
-1 不显示只在第1个文件里出现过的列
-2 不显示只在第2个文件里出现过的列
-3 不显示只在第1和第2个文件里出现过的列

comm -3 <(git ls-files --exclude-standard --deleted | sort) <(git ls-files --exclude-standard --others --modified | sort)

comm -3 <(git ls-files --exclude-standard --deleted | sort) <(git ls-files --exclude-standard --others --modified | sort) | sed -e 's/^[[:space:]]*//'

sed -e 's/^[[:space:]]*//' 清除输出的文件前面的空格

感谢大家的回答,问题解决。

阅读 1.9k
2 个回答

功能说明:
1.获取修改文件列表(不包括删除文件);
2.获取新增文件列表;
3.文件是否在暂存空间,都能获取到文件列表(暂存空间文件和未暂存空间文件重复去重)。


1.获取未暂存文件列表(不包括删除文件):

comm -3 <(git ls-files --exclude-standard --deleted | sort) <(git ls-files --exclude-standard --others --modified | sort) | sed -e 's/^[[:space:]]*//'

2.获取暂存文件列表:

git diff --name-only --cached --diff-filter=d 

3.获取暂存空间和未暂存空间文件列表并过滤重复项:

comm -3 <(git diff --name-only --cached --diff-filter=d | sort) <(comm -3 <(git ls-files --exclude-standard --deleted | sort) <(git ls-files --exclude-standard --others --modified | sort) | sed -e 's/^[[:space:]]*//') | sed -e 's/^[[:space:]]*//'

相关资料说明:
git ls-files 命令(获取未暂存文件列表):

git ls-files --exclude-standard --others    // 获取新增文件列表
git ls-files --exclude-standard --modified  // 获取修改文件列表
git ls-files --exclude-standard --deleted   // 获取删除文件列表

git diff 命令(获取暂存文件列表):

git diff --name-only --cached                  // 获取暂存区所有文件
git diff --name-only --cached --diff-filter=A  // 获取新增文件
git diff --name-only --cached --diff-filter=D  // 获取删除文件
git diff --name-only --cached --diff-filter=M  // 获取修改文件
git diff --name-only --cached --diff-filter=d  // 排除删除文件

--diff-filter 参数:
A:新增文件
D:已删除文件
M:修改过文件
小写字母取反;


comm 命令(取列表差集):

comm [-123][--help][--version][第1个文件][第2个文件]

参数:
-1 不显示只在第1个文件里出现过的列
-2 不显示只在第2个文件里出现过的列
-3 不显示只在第1和第2个文件里出现过的列

sed -e 's/^[[:space:]]*//' 清除输出的文件前面的空格

感谢大家的帮助。

列出所有已添加到暂存区且内容发生变动的文件
git diff --cached --name-only
列出所有已添加到暂存区的新文件
git diff --cached --diff-filter=A --name-only
列出所有未添加到暂存区且内容发生变动的文件
git diff --name-only
列出所有新添加到工作目录但尚未添加到暂存区的文件
git diff --diff-filter=A --name-only
去除重复项,上述命令的结果合并,用shell命令sort和uniq

获取Git中所有改动和新增文件列表(含暂存和未暂存),逐个运行对应命令后合并去重,但无法直接识别文件暂存状态。要排除删除文件,不使用--diff-filter=D。若需按暂存状态分类展示,分别执行命令查看。

推荐问题
宣传栏