如何列出当前暂存或提交的被git忽略的文件?
如何获得与.gitignore文件中的规则匹配的文件列表,但这些文件在过去已被暂存或提交?这一问题的答案很好。基本上,git clean-ndX会告诉您哪些内容可以安全地忽略。ls files的文档编写得不太清楚,但下面的简单别名似乎可以完成这项工作:如何列出当前暂存或提交的被git忽略的文件?,git,Git,如何获得与.gitignore文件中的规则匹配的文件列表,但这些文件在过去已被暂存或提交?这一问题的答案很好。基本上,git clean-ndX会告诉您哪些内容可以安全地忽略。ls files的文档编写得不太清楚,但下面的简单别名似乎可以完成这项工作: git config --global alias.showtrackedignored "ls-files -i --exclude-standard" 上面的命令创建一个名为showtrackedignored的别名。要使用,请运行: gi
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从顶级目录而不是当前目录运行基于shell的别名;请参阅git showtrackedinogred
中的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问题),而不必删除,但要快速复制粘贴,这段代码是危险的!也许值得用两行不同的文字来写?