如何获得与.gitignore文件中的规则匹配但过去已暂存或提交的那些文件的列表?
Answers:
到的文档ls-files写得不太清楚,但似乎以下简单的别名可以完成此工作:
git config --global alias.showtrackedignored "ls-files -i --exclude-standard"
上面的命令创建了一个别名showtrackedignored。要使用,请运行:
git showtrackedignored
它将列出当前目录和子目录中已跟踪的所有文件,但如果未跟踪它们,将被忽略。
git ls-files不幸的是,这不能100%可靠地工作。显然Git的的确发现,应将文件的一个好工作不被忽略,但搜索该文件时被忽略(-i选项git ls-files),它的目录里面没有列表被忽略的文件,如果它是相匹配的忽略规则的目录。
要解决此错误,请尝试转换您的忽略规则,以便仅匹配文件,而不匹配目录(这并非总是可能的)。
(感谢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运行从顶层目录,而不是当前目录基于壳别名;见节上alias.*的git help config)untracked_list。该变量保存一个临时文件的路径,该文件将包含当前被忽略文件的列表。该临时文件在.git目录中。${untracked_list}。grep,以过滤出写入的文件${untracked_list}。${untracked_list}。这种方法的缺点:
.git目录中创建一个临时文件。grep。它还具有与以前的别名相同的错误。
git help ignore说“foo/将匹配目录foo及其下的路径”。显然,当Git试图识别不被忽略的文件时,“其下的路径”部分将起作用,但是当Git试图识别被忽略的文件时,它就会损坏。
git ls-files -i --exclude-standard确实是一种更清洁,正确工作的方法。我在这里有一个回购,其中常规别名给出了错误的结果。
根据理查德(Richard)的回答,就将其留在这里:
git ls-files -i --exclude-standard | xargs git rm --cached
这将删除被忽略的每个跟踪文件.gitignore。
https://stackoverflow.com/a/467053很好地回答了这个问题。基本上,git clean -ndX会告诉您可以安全忽略的内容。
d,则会列出未跟踪的文件以及已暂存和已提交的文件。在我看来,它并不能真正回答问题。