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

如何列出当前暂存或提交的被git忽略的文件?,git,Git,如何获得与.gitignore文件中的规则匹配的文件列表,但这些文件在过去已被暂存或提交?这一问题的答案很好。基本上,git clean-ndX会告诉您哪些内容可以安全地忽略。ls files的文档编写得不太清楚,但下面的简单别名似乎可以完成这项工作: git config --global alias.showtrackedignored "ls-files -i --exclude-standard" 上面的命令创建一个名为showtrackedignored的别名。要使用,请运行: gi

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

这一问题的答案很好。基本上,git clean-ndX会告诉您哪些内容可以安全地忽略。

ls files的文档编写得不太清楚,但下面的简单别名似乎可以完成这项工作:

git config --global alias.showtrackedignored "ls-files -i --exclude-standard"
上面的命令创建一个名为
showtrackedignored
的别名。要使用,请运行:

git showtrackedignored
它将列出当前目录和子目录中所有被跟踪的文件,但如果它们没有被跟踪,将被忽略

git ls文件中的Bug 不幸的是,这并不能100%可靠地工作。显然,Git在查找不应被忽略的文件方面做得很好,但在搜索被忽略的文件时(Git ls files的
-i
选项),如果目录符合忽略规则,它不会在目录中列出被忽略的文件

要解决此错误,请尝试转换忽略规则,以便只匹配文件,而不匹配目录(这并不总是可能的)

(感谢您发现这个bug!编辑:现在正在开发一个修补程序,它将成为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 showtrackedinogred
    的目录(git从顶级目录而不是当前目录运行基于shell的别名;请参阅
    git help config
    中的
    alias.
    部分)
  • 定义一个名为
    untracked_list
    的变量。此变量保存临时文件的路径,该临时文件将包含当前忽略文件的列表。此临时文件位于
    .git
    目录中
  • 将忽略文件的列表写入
    ${untracked_list}
  • 告诉Git把索引当作是空的,列出所有被忽略的文件
  • 输出到
    grep
    的管道,该管道过滤出写入
    ${untracked_list}
    的文件
  • 删除临时文件
    ${untracked_list}
这种方法的缺点:

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

它还存在与前一个别名相同的错误。

根据Richard的回答,将此错误留在这里:

git ls文件-i--排除标准的| xargs git rm--缓存的


这将删除被
.gitignore
忽略的所有跟踪文件。其他答案仅显示当前被忽略但存在于工作树/索引中的文件

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

git log--pretty=format:--name only--diff filter=A`#所有文件都有`\
|sed'/^$/d'`#跳过git日志空行`\
|排序-u`#排序+唯一`\
|tr'\n'\0'`#xargs的空分隔符`\
|xargs-0 git检查忽略#检查它们是否被忽略
不确定是否多次显示重命名的文件

编辑:
修复格式并跳过列出未跟踪文件和目录的
git log
空行

,如果您删除
d
,它将列出未跟踪的文件以及暂存和提交的文件。在我看来,这并没有真正回答这个问题。@Hedgehog:这是一个重复的问题,但seth从中选择了错误的答案。我不怀疑他们在同一个街区,但他们不是重复的问题。从观察中似乎可以清楚地看出,不清楚这些答案中哪一个(如果有的话)正是这样做的。中的问题是“列出存在哪些被忽略的文件”另一个问题答案的可能重复项,您要查找的是
git ls文件-i--排除标准文件或其变体。据我所知,这不是重复项。这个问题是问如何列出被忽略的未跟踪文件。这个问题是问如何列出被跟踪的文件(因此不受忽略规则的约束),但如果没有跟踪,这些文件将被忽略。最近git是否有更改破坏了此脚本?自从我找到它以来,它工作得非常好,但我最近发现它并没有发现所有已提交的文件/文件夹(或者可能只是文件夹),而是匹配忽略模式。我在git 1.7.9.5上。有什么想法吗?@Christoph:在Linux(Ubuntu)上使用1.7.10对我有用。尝试分别手动运行每个命令,以查看脚本的哪一部分行为不正常。如果你发现问题,让我知道,我会更新我的答案。另外,请告诉我您是否可以创建一个展示问题的示例存储库。谢谢@Christoph:
git help ignore
表示“
foo/
将匹配目录
foo
及其下的路径”。显然,“它下面的路径”部分在Git试图识别未被忽略的文件时起作用,但在Git试图识别被忽略的文件时被破坏。如今,
Git ls files-i--exclude standard
确实是更干净和正确的工作方法。我这里有一个repo,传统的别名给出了错误的结果。@Christoph:谢谢,我编辑了答案,将简单的方法放在顶部,并在复杂的方法中添加了一个警告。如果有人只想列出文件(根据OP问题),而不必删除,但要快速复制粘贴,这段代码是危险的!也许值得用两行不同的文字来写?