.git属性的预定义值

.git属性的预定义值,git,Git,有时,人们使用已知扩展名列表创建.gittattributes文件,并手动将其声明为文本或二进制: *.ts text *.js text *.json text *.csv text *.txt text *.xml text # etc. Git是否有一个默认(内置)的流行文件扩展名列表(如.txt、.json等)?在每个回购协议中手动声明众所周知的扩展是否有意义 如果Git不知道扩展怎么办? 它是否尝试通过搜索下线符号来使用启发式,或者将所有未知扩展视为二进制 Git是否有一个默认(内置

有时,人们使用已知扩展名列表创建.gittattributes文件,并手动将其声明为
文本
二进制

*.ts text
*.js text
*.json text
*.csv text
*.txt text
*.xml text
# etc.
Git是否有一个默认(内置)的流行文件扩展名列表(如.txt、.json等)?在每个回购协议中手动声明众所周知的扩展是否有意义

如果Git不知道扩展怎么办? 它是否尝试通过搜索下线符号来使用启发式,或者将所有未知扩展视为
二进制

Git是否有一个默认(内置)的流行文件扩展名列表(如.txt、.json等)

没有

在每个回购协议中手动声明众所周知的扩展是否有意义

这取决于您打算将什么放入存储库,以及是否必须处理Windows

如果Git不知道扩展怎么办

Git根本不知道扩展

对于系统行为不好的用户(现在基本上只有Windows),Git默认对每个文件的内容进行快速扫描。如果内容是二进制的,Git会猜测该文件是二进制的,并且不会进行任何EOL转换。如果内容看起来是文本,Git会猜测它是文本,并执行所选的EOL转换


在sane系统上(现在基本上不是Windows),默认的EOL转换是“不接触数据”,因此即使Git将文件检测为文本,它也不会对数据进行任何处理。所以在这里,根本不需要做任何事情。

这是否意味着如果
core.autocrlf=true
(Windows上的默认设置),Git会扫描repo中每个文件的内容,以试探性地确定它是文本还是二进制文件?@SergeyKostrukov:不精确,但足够接近。幸运的是,这非常简单,因为Git无论如何都必须扫描每个文件的内容。执行
git签出
需要从签出的提交中填充索引和工作树。这包括识别新提交中哪些blob位于哪个文件名之下,而旧提交中哪些blob位于哪个文件名之下。例如,假设当前提交有三个文件A、B和C;新提交有三个名为C、D和E的文件。[续]要从当前文件切换到新文件,Git必须:删除A、删除B、决定是否替换文件C、提取并写出D、提取并写出E。如果C在旧提交和新提交中有相同的哈希,Git可以不处理它,只需担心D和E。如果它有不同的哈希,Git必须提取C、D和E。所以Git要么读取两个文件,要么读取三个文件。[cont'd]此时,Git知道它必须将文件复制到索引和工作树中。复制到索引中很简单:使用正确的哈希ID和工作树
stat
数据写入索引项。但是,复制到工作树中意味着解压缩压缩对象。在解压过程中,Git收集文件内容统计信息:这个文件看起来是二进制的,还是纯文本的?现在文件已解压缩,Git将其写入工作树,执行任何EOL过滤。缓慢的部分是解压和写入,而不是检测和EOL转换。类似的规则在
git add
期间适用:git扫描工作树和/或指示的路径,使用
lstat
将它们与索引内容进行比较,并决定是否必须更新索引副本。如果是这样,Git必须读取文件并进行压缩,然后将压缩后的对象写入repo。在阅读过程中,Git收集内容统计信息。缓慢的部分是读取文件、压缩和写入对象,而不是分析和EOL转换。