第41章 Git的其他特性

41.1 属性

Git通过属性文件为版本库中的文件或目录添加属性。设置了属性的文件或目录,在执行Git相关操作时会做特殊处理,正如之前介绍换行符转换时设置了文本属性(text)的文件那样。

41.1.1 属性定义

属性文件是一个普通的文本文件,每一行对一个路径(可使用通配符)设置相应的属性。语法格式如下:


<pattern><attr1><attr2>…


其中路径由可以使用通配符的<pattern>来定义,在<pattern>后面可以设置一个或多个属性,不同的属性之间用空格分开。路径中通配符的用法和文件忽略(.gitignore)的语法格式相同,参见本书第2篇第10章的“10.8文件忽略”的相关内容。下面以text属性为例来介绍属性的不同写法:

text

直接通过属性名进行设置,相当于将text的属性值设置为true。

对于设置了text属性的文件,不再需要Git来猜测文件的类型,而可以直接判定为文本文件并进行相应的换行符转换。

-text

在属性名前用减号标识,相当于将text的属性值设置为false。

对于设置了取反text属性的文件,直接判定为二进制文件,在文件检入和检出时不进行换行符转换。

!text

在属性名前面添加感叹号,相当于没有设置该属性,既不等于true,也不等于false。对于未定义text属性的文件,根据Git是否配置了core.autocrlf配置变量来决定是否进行换行符转换。因此对于!text(没有定义text属性)和-text(text属性设置取反),两者存在差异。

text=auto

属性除了上述true、false和未设置三个状态外,还可以对属性用相关的枚举值(预定义的字符串)进行设置。不同的属性值可能有不同的枚举值,对于text属性可以设置为auto。

对于text属性设置为auto的文件,文件类型实际上尚未确定,需要Git读取文件内容进行智能判别,判别为文本文件则进行换行符转换。显然当设置text属性为auto时,并不等同于设置为true。