我想从裸 git存储库中找到给定git分支中ascii / text的所有文件,并将它们的总大小相加。
由于这是一个简单的仓库,它没有工作树,简单地检查分支并直接测试文件的解决方案将无法工作。可能有数百个这样的存储库总计数百GB,并且它们对于此任务而言是只读的。这意味着创建工作树不是一个选项,存储库的大小意味着制作每个存储库的副本并在副本中创建工作树是不切实际的。
我可以在裸git存储库中列出属于特定分支的所有对象,如下所示:
git ls-tree -r master --long
这给了我对象哈希:
100644 blob 486a23256c437b811b5647e40517a35964f60dc6 42 file1.txt
100644 blob f7b528c3a1412c12213e56394b679397bd4ecaa7 131 file2.xml
100644 blob 773c90bbb7ab5552d47ce2fb153fc9d18ed0d386 5617 file3.jpg
100644 blob 420cb792e80a97c89db9c9d7339b4fb9a680aa43 13130 file3.zip
在上面的例子中,我想只得到前两个明文对象,但我不知道如何测试一个对象本身的文件类型。
答案 0 :(得分:2)
Git本身不区分文本和二进制文件。许多前端瓷器都有,但内部没有区别。找出使用非基于git的工具file
的最佳方法。要将内容发送到file
,您可以使用git show
。例如,如果您运行git show 486a23256c437b811b5647e40517a35964f60dc6 | file -
,则可能会获得/dev/stdin: ASCII text
。如果您运行git show f7b528c3a1412c12213e56394b679397bd4ecaa7 | file -
,则可能会获得/dev/stdin: XML 1.0 document text
。
通常,file
尝试制作看起来像纯文本的任何内容在输出中的某处都有单词text
,并且没有看起来像文本的东西。更具体地说,man
的{{1}}页说:
打印的类型通常包含一个单词text(该文件只包含打印字符和一些常用控制字符,并且可以安全地在ASCII终端上读取),可执行文件(该文件包含编译程序的结果)以某种UNIX内核或其他形式可理解的形式,或数据意味着其他任何东西(数据通常是'二进制'或不可打印)。例外是已知包含二进制数据的众所周知的文件格式(核心文件,tar档案)。
因此,如果您将file
的输出通过git show
,然后在输出中查找file
,则应该能够确定它是文本还是二进制文件。