如何获取与.gitignore文件中的规则匹配但过去已暂存或提交的文件的列表?
答案 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}
。grep
的管道,用于过滤掉写入${untracked_list}
的文件。${untracked_list}
。这种方法的缺点:
.git
目录中创建一个临时文件。grep
。它也遭受与前别名相同的错误。
答案 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会告诉你什么可以安全地忽略。