我有一个存储库,其中包含许多自动生成的源文件,我在.gitattributes
中将其标记为“二进制”(它们已签入,因为并非每个人都可以访问生成器工具)。另外,repo在被忽略的目录中有很多source-ish文件(再次,作为构建过程的一部分生成),以及许多实际的二进制文件(例如像图标这样的小资源文件)。
我现在想要在repo中找到所有非自动生成和非忽略的文件。我以为我只是用find
和一堆排除对象来做这件事,但现在我有一个可怕的find
声明中有十几个条款(并且它仍然不能很好地完成这项工作)。 git ls-files
可以正常工作,但会向我展示所有二元文件,而不需要区分,我必须将其过滤掉。
所以,我想知道:是否有一个简单的命令我可以运行,它列出了检入仓库的每个文件,以及哪个git
认为是“文本”文件?
答案 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 $''
答案 2 :(得分:1)
您使用 gits eol
属性来查找非二进制文件。
git ls-files --eol | grep 'i/lf'
这里列出了所有签入的文件以“LF”行结尾。
这具有使用 git ls-files
命令的优点,因此可以轻松地通过管道传输到 xargs
。这也是一个管道命令,所以它可能会更快(我没有进行基准测试)。
这可能是使用 git grep
method 的一种可行替代方法,因为它似乎更易于自定义,因为二进制 而不是。
请注意,您可以在 .gitattributes
中指定 git 应该考虑哪些文件 binary。因此,如果您将 *.svg binary
添加到 .gitattributes
。 git 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
,但它不提供列出非二进制文件的完全自动化方式:您仍然必须在单独的模式文件中识别并列出它们。