22

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

我现在想在 repo 中找到所有非自动生成和非忽略的文件。我以为我会用find一堆排除项来做这件事,但现在我有一个find包含十几个子句的可怕声明(它仍然不能完美地完成这项工作)。git ls-files有效,但向我展示了所有二进制文件,没有区分,我必须过滤掉。

所以,我想知道:是否有一个简单的命令可以运行,它列出了签入 repo 的每个文件,并且git考虑了一个“文本”文件?

4

4 回答 4

28
git grep --cached -Il ''

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

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

或者您可以使用如何确定 Git 将文件处理为二进制文件还是文本文件?在一个 for 循环中git ls-files

TODO 空文件。

改为查找所有二进制文件:在 git HEAD 中查找所有二进制文件

使用此测试存储库在 Git 2.16.1 上进行了测试。

于 2014-06-22T09:55:43.173 回答
3

实现此目的的巧妙技巧:列出所有包含回车的非二进制文件

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

就我而言,空字符串效果更好:

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

git list 二进制和/或非二进制文件中获取它?.

于 2014-05-05T18:37:58.703 回答
2

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

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

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

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

这可能是使用该git grep方法的可行替代方案,因为它似乎更可定制,就人们认为的二进制而不是二进制而言。

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

于 2021-05-01T13:22:24.553 回答
0

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

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

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

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

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

那将不那么复杂find,但它没有提供一种完全自动化的方式来列出非二进制文件:您仍然必须在单独的模式文件中识别和列出它们。

于 2013-09-24T05:37:45.620 回答