如何列出git存储库中的所有文本(非二进制)文件?

时间:2013-09-24 04:39:37

标签: git text-files

我有一个存储库,其中包含许多自动生成的源文件,我在.gitattributes中将其标记为“二进制”(它们已签入,因为并非每个人都可以访问生成器工具)。另外,repo在被忽略的目录中有很多source-ish文件(再次,作为构建过程的一部分生成),以及许多实际的二进制文件(例如像图标这样的小资源文件)。

我现在想要在repo中找到所有非自动生成和非忽略的文件。我以为我只是用find和一堆排除对象来做这件事,但现在我有一个可怕的find声明中有十几个条款(并且它仍然不能很好地完成这项工作)。 git ls-files可以正常工作,但会向我展示所有二元文件,而不需要区分,我必须将其过滤掉。

所以,我想知道:是否有一个简单的命令我可以运行,它列出了检入仓库的每个文件,以及哪个git认为是“文本”文件?

4 个答案:

答案 0 :(得分:16)

git grep --cached -Il ''

列出所有非空常规(无符号链接)文本文件:

  • -I:不匹配二进制文件中的模式
  • -l:仅显示匹配的文件名,而不是匹配的行
  • '':空字符串使git grep匹配任何非空文件
  • --cached:还查找添加了git add但尚未提交的文件(可选)

或者您可以在git ls-files的for循环中使用How to determine if Git handles a file as binary or as text?

TODO空文件。

改为查找所有二进制文件:Find all binary files in git HEAD

使用this test repo在Git 2.16.1上测试。

答案 1 :(得分:3)

实现此目的的聪明黑客:列出包含回车的所有非二进制文件

$ git grep --cached -I -l -e $'\r'

对于我的情况,空字符串效果更好:

$ git grep --cached -I -l -e $''

git list binary and/or non-binary files?取得它。

答案 2 :(得分:1)

您使用 gits eol 属性来查找非二进制文件。

git ls-files --eol | grep 'i/lf'

这里列出了所有签入的文件以“LF”行结尾。

这具有使用 git ls-files 命令的优点,因此可以轻松地通过管道传输到 xargs。这也是一个管道命令,所以它可能会更快(我没有进行基准测试)。

这可能是使用 git grep method 的一种可行替代方法,因为它似乎更易于自定义,因为二进制 而不是。

请注意,您可以在 .gitattributes 中指定 git 应该考虑哪些文件 binary。因此,如果您将 *.svg binary 添加到 .gitattributesgit grep 方法尊重这一点。 eol 属性也将尊重,但不适用于在设置该属性之前已签入索引的旧文件。但您始终可以添加 | grep -v 'attr/-text' 以排除在 .gitattributes 中设置为二进制的文件。

答案 3 :(得分:0)

列出非忽略文件的标准方法是:

git ls-files --exclude-standard --cached

但是,如您所见,它列出了所有版本化文件。

一种解决方法可能是在单独的文件“exclude_binaries”和exclusion pattern中定义,以便匹配您知道的所有二进制文件。

git ls-files --exclude-standard --cached \
--exclude-from=/path/to/`exclude_binaries`

这将是一个不太复杂的find,但它不提供列出非二进制文件的完全自动化方式:您仍然必须在单独的模式文件中识别并列出它们。