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


76

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



1
在另一个问题的答案中,您正在寻找的git ls-files -i --exclude-standard可能是它的变体,也可能是它的变体。
卡斯卡贝尔2012年

10
据我了解,这不是git显示被忽略文件的重复。这个问题问的是如何列出被忽略的未跟踪文件。这个问题问如何列出要跟踪的文件(因此不受忽略规则的约束),但是如果不跟踪它们,则将被忽略。
理查德·汉森

Answers:


100

到的文档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}
  • 告诉Git仿佛索引为空并列出所有被忽略的文件。
  • 管道输出到grep,以过滤出写入的文件${untracked_list}
  • 删除临时文件${untracked_list}

这种方法的缺点:

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

它还具有与以前的别名相同的错误。


最近对git进行了哪些更改,从而破坏了此脚本?自从我找到它以来,它的运行效果非常好,但是我最近发现它不会发现已提交但与忽略模式匹配的所有文件/文件夹(或者可能只是文件夹)。我在git 1.7.9.5上。有任何想法吗?
Christoph

1
@Christoph:在Linux(Ubuntu)上适用于1.7.10。尝试分别手动运行每个命令,以查看脚本的哪一部分行为异常。如果您发现问题,请告诉我,我将更新答案。另外,让我知道您是否可以创建一个显示问题的示例存储库。谢谢!
理查德·汉森

1
@Christoph:git help ignore说“foo/将匹配目录foo及其下的路径”。显然,当Git试图识别被忽略的文件时,“其下的路径”部分将起作用,但是当Git试图识别忽略的文件时,它就会损坏。
理查德·汉森

2
如今,git ls-files -i --exclude-standard确实是一种更清洁,正确工作的方法。我在这里有一个回购,其中常规别名给出了错误的结果。
Christoph

1
@Christoph:谢谢,我编辑了答案,将简单的方法放在顶部,并对复杂的方法添加了警告。
理查德·汉森

19

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

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

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


-3

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


该列表列出了未跟踪的文件和目录,如果您删除d,则会列出未跟踪的文件以及已暂存和已提交的文件。在我看来,它并不能真正回答问题。
刺猬2012年

@刺猬:这是重复的,但塞思从中选择了错误的答案。
卡斯卡贝尔2012年

我并不怀疑它们在同一个街区,但是从观察到,似乎不清楚这些答案中的哪一个(如果有的话)恰恰做到了这一点,因此它们不是重复的问题。在git显示忽略的文件中的问题是“列出存在哪些文件被忽略”
Hedgehog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.