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

Hed*_*hog 61 git

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

Ric*_*sen 85

文档ls-files并没有写得清楚,但看起来以下简单的别名可以完成这项工作:

git config --global alias.showtrackedignored "ls-files -i --exclude-standard"
Run Code Online (Sandbox Code Playgroud)

上面的命令创建一个名为的别名showtrackedignored.要使用,请运行:

git showtrackedignored
Run Code Online (Sandbox Code Playgroud)

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

错误 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}"'
Run Code Online (Sandbox Code Playgroud)

别名执行以下操作:

  • cd回到其中目录git showtrackedignored是从运行(GIT运行从顶层目录,而不是当前目录基于壳别名;参见上一节alias.*git help config)
  • 定义一个名为的变量untracked_list.此变量保存临时文件的路径,该文件将包含当前忽略的文件列表.此临时文件位于.git目录中.
  • 将被忽略的文件列表写入${untracked_list}.
  • 告诉Git表现为索引为空并列出所有被忽略的文件.
  • 输出到的管道grep,用于过滤掉写入的文件${untracked_list}.
  • 删除临时文件${untracked_list}.

这种方法的缺点:

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

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

  • 如今,`git ls-files -i --exclude-standard`实际上是更清洁,更正确的方法.我在这里有一个repo,传统的别名给出了错误的结果. (2认同)

Tim*_*oot 12

根据理查德的回答,在这里留下这个:

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

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

  • 如果有人只想列出文件(根据OP问题)而不一定要删除,但要快速复制粘贴,则此代码是危险的!是否值得用两行不同的文字来写? (9认同)