如何获取已经提交或者暂存的与.gitignore规则匹配的文件列表?
ls-files
的文档并不十分清晰,但是似乎以下简单的别名可以完成任务:
git config --global alias.showtrackedignored "ls-files -i --exclude-standard"
showtrackedignored
的别名。要使用,请运行:git showtrackedignored
它将列出当前目录和子目录中所有被跟踪但如果不被跟踪则会被忽略的文件。
git ls-files
中的错误不幸的是,这并不完全可靠。显然,Git能够很好地找到不应该被忽略的文件,但在搜索应该被忽略的文件(git ls-files
的-i
选项)时,如果匹配忽略规则的目录,则不会列出该目录内被忽略的文件。
为了解决这个问题,请尝试转换您的忽略规则,使其仅匹配文件而不是目录(这并非总是可能的)。
(感谢Christoph发现此漏洞并向Git邮件列表报告!编辑:现在正在进行补丁工作,将包含在git 1.7.11.2或更高版本中)
这是一种不同的方法。 它要复杂得多,可能会有破损的角落案例。
git config --global alias.showtrackedignored '!
cd "${GIT_PREFIX}" &&
untracked_list=$(git rev-parse --git-dir)/ignored-untracked.txt &&
git ls-files -o -i --exclude-standard >"${untracked_list}" &&
GIT_INDEX_FILE="" git ls-files -o -i --exclude-standard | grep -Fvxf "${untracked_list}" &&
rm -rf "${untracked_list}"'
cd
回到运行git showtrackedignored
的目录(Git从顶级目录而不是当前目录运行基于shell的别名;请参见git help config
中关于alias.*
的部分)untracked_list
的变量。此变量保存指向包含当前被忽略文件列表的临时文件的路径。此临时文件位于.git
目录中。${untracked_list}
。grep
,过滤掉写入${untracked_list}
的文件。${untracked_list}
。这种方法的缺点:
.git
目录中创建了一个临时文件。grep
实现。git help ignore
中写道:“foo/
将匹配目录foo
及其下面的路径”。显然,“其下面的路径”部分在Git试图识别未被忽略的文件时有效,但在Git试图识别已被忽略的文件时则无效。 - Richard Hansengit ls-files -i --exclude-standard
是一个更加干净和正确的方法。我有一个存储库,在那里传统的别名会给出错误的结果。 - Christoph只是在这里留下一个,基于Richard的答案:
git ls-files --cached -i --exclude-standard
要删除每个被.gitignore
忽略的已跟踪文件:
git ls-files --cached -i --exclude-standard | xargs git rm --cached
git ls-files -z --cached -i --exclude-standard | xargs -0 git rm --cached
。-z
告诉 git-ls-files 以 null 终止符输出每个路径,在管道的 xargs 端使用 -0
进行镜像。 - Jules Kerssemakersgit log --pretty=format: --name-only --diff-filter=A `# all files ever` \
| sed '/^$/d' `# skip git-logs empty lines` \
| sort -u `# sort + unique` \
| tr '\n' '\0' `# null separate for xargs` \
| xargs -0 git check-ignore # check if they are ignored
不确定重命名的文件是否会显示多次。
修复格式并跳过git-log
中的空行。
这个问题在https://dev59.com/bHRB5IYBdhLWcg3w6bcE#467053中得到了很好的回答。基本上,git clean -ndX会告诉你哪些可以安全地忽略。
d
参数,它还会列出已暂存和已提交的未被追踪文件。但我认为这并没有真正回答问题。 - Hedgehog
git ls-files -i --exclude-standard
或者可能是它的变体。 - Cascabel