如何列出当前暂存或提交的git忽略的文件?

时间:2012-02-16 22:39:07

标签: git

如何获取与.gitignore文件中的规则匹配但过去已暂存或提交的文件的列表?

4 个答案:

答案 0 :(得分:77)

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发现此错误和reporting it to the Git mailing list!编辑:现在正在修补补丁并将其转换为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的别名,而不是当前目录;请参阅alias.*git help config部分1}})
  • 定义名为untracked_list的变量。此变量保存临时文件的路径,该文件将包含当前忽略的文件列表。此临时文件位于.git目录中。
  • 将忽略的文件列表写入${untracked_list}
  • 告诉Git表现为索引为空并列出所有被忽略的文件。
  • 输出到grep的管道,用于过滤掉写入${untracked_list}的文件。
  • 删除临时文件${untracked_list}

这种方法的缺点:

  • 它会在.git目录中创建一个临时文件。
  • 假设您有一个与POSIX兼容的shell。
  • 它假设您具有与grep
  • 兼容的POSIX

它也遭受与前别名相同的错误。

答案 1 :(得分:12)

根据理查德的回答,将其留在这里:

git ls-files -i --exclude-standard | xargs git rm --cached

这将删除.gitignore忽略的每个跟踪文件。

答案 2 :(得分:0)

其他答案仅显示当前被忽略但存在于工作树/索引中的文件。

查看当前被忽略但过去签入(可能现在已删除)的文件

git 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空行

答案 3 :(得分:-3)

https://stackoverflow.com/a/467053很好地回答了这个问题。基本上,git clean -ndX会告诉你什么可以安全地忽略。