.gitattributes使用方法
.gitattributes使用方法
介绍
.gitattributes
是一个文本文件,文件中的一行定义一个路径的若干个属性,主要用于定义每种文件的属性,以方便 git
帮我们统一管理。
.gitattributes
文件是一个用来配置 Git 版本控制系统的文件,它的作用主要包括以下几个方面:
- 定义文件属性:
.gitattributes
文件可以用来指定特定文件或文件类型的属性,例如文本文件、二进制文件、合并策略等。这可以帮助 Git 更好地处理不同类型的文件。 - 控制行尾格式:你可以使用
.gitattributes
文件来指定文本文件的行尾格式,例如 UNIX 风格的 LF(换行符)或 Windows 风格的 CRLF(回车符+换行符)。这对于跨平台协作和一致的行尾格式非常重要。 - 合并策略:
.gitattributes
文件可以指定合并冲突时使用的合并策略。例如,你可以指定某个文件使用 “union” 策略,以在合并冲突时保留所有版本的更改。 - 指定差异算法:你可以为特定文件指定使用不同的文本差异算法,以控制 Git 如何计算和显示差异。
- 特定文件处理:
.gitattributes
文件可以定义一些特定文件的自定义行为,例如执行清理操作、忽略文件等。 - 执行 Git 钩子:你可以使用
.gitattributes
文件来触发 Git 钩子,以在特定操作发生时执行自定义脚本或操作。
可定义属性
text
用于控制行尾的规范性。如果一个文本文件是规范的,则Git库汇总该文件(git服务器上的文件)的行尾总是LF
。对于工作目录,除了text
属性之外,还可以设置eol
属性或core.eol配置变量。
eol
设置行末字符。
- eol=lf ,[回车] :入库时将行尾规范为LF,检出时行尾不强制转换为 CRLF
- eol=crlf,[换行、回车] :入库时将行尾规范为LF,检出时将行尾转换为CRLF
补充内容
GRLF 和 LF都是用来表示文本换行的方式。CR代表回车,对应字符 \r。LF 表示换行,对应字符 \n。不同操作系统文本使用的换行符各不相同。Windows系统使用的是 CRLF,Unix系统(包括Linux,MacOS近些年的版本)使用的是 LF。
事实上,可能并不是所有的开发者用的环境都完全一样,比如有的开发者使用 Windows 环境开发,他们的文本文件的换行符是 ‘\r\n’(CRLF);而有的开发者使用 MacOS 环境开发,这些开发者文本文件的换行符是 ‘\n’(LF)。为了使得不同系统环境的开发者能开发同一个git项目,便出现了这个。
我们知道git主要是用来跟踪文件版本的,跟踪文件版本自然离不开比较差异,而diff
就是用来告诉git声明文件需要比较版本差异的。diff
属性影响Git对特殊文件生成差异的方式。它可以告诉Git是否为路径生成文本补丁还是将路径视为二进制文件。它也可以影响在hunk
头部显示的@@ -k,l +n,m @@,告诉Git使用外部命令来生成差异,或者是在生成差异之前让Git将二进制文件转换为文本文件。
diff:强制视为文本文件,即使它包含一些通常从不会出现在文本文件的字节值,例如NUL
。
!diff:表示为非文本文件,没有设置diff
属性的路径会生成differ
二进制文件(如果启用了二进制补丁,会生成二进制补丁)。
未定义:未指明diff
属性的路径首先会检查其内容,如果它看起来像文本文件并且小于大文件阈值(core.bigFileThreshold),则将其视为文本文件,否则将生成differ
二进制文件。
differ 规则
diff
是使用指定的 diff
驱动程序显示的。每个驱动程序可以指定一个或多个选项。
这玩意在gitconfig里搞,不是gitattributes。
binary
例如:
1 |
|
上面会把所有的文件都 LF 化,不同的是单独为需要的资源添加了 binary。
生效顺序
在一个Git库中可以有多个.gitattributes 文件,不同.gitattributes 文件中,属性设置的优先级(从高到低)如下:
- /myproj/info/attributes
- /myproj/my_path/.gitattributes
- /myproj/.gitattributes
同一个.gitattributes 文件中,遵循覆盖原则,即后面的行会覆盖前面的设置,如果一个文件的某个属性被多次设置,则后设置的优先,类似int a = 1; a = 2;
最终结果a == 2
。
示例
1 |
|
上面是一个 .gitattributes
文件的示例,它定义了一些文件扩展名的属性,以指定它们在 Git 中的处理方式。让我解释一下这个示例:
* text=auto
:这一行是一个通用规则,指示 Git 自动检测文件类型,并根据文件内容将其视为文本文件或二进制文件。- 接下来的部分包含了一系列规则,它们指定了特定文件扩展名的处理方式。这些规则基本上告诉 Git 哪些文件应该被视为文本文件,以及如何处理它们。这些规则包括以下内容:
*.vue text eol=lf
,*.js
,*.cjs
,*.ts
,*.tsx
,*.json
,*.css
,*.less
,*.scss
,*.html
,*.md
:将这些文件扩展名的文件都视为文本文件,并将它们的行尾格式设置为 LF(换行符)。
- 之后的部分包含了一系列规则,它们指定了特定文件扩展名的处理方式,即将这些文件视为二进制文件,不进行文本处理。这些规则包括以下内容:
*.png
,*.jpg
,*.jpeg
,*.pdf
,*.svg
:将这些文件扩展名的文件都视为二进制文件,不进行文本处理。
- 最后是 Linguist 库的属性,它用于生成我们常见的GitHub语言分布。
总的来说,这个 .gitattributes
文件的目的是为了确保一些常见文件类型(如代码文件和文本文件)在 Git 中的处理方式保持一致,以及将它们的行尾格式标准化为 LF。对于二进制文件,不进行额外的处理。这有助于在多平台协作中保持一致性,并减少不必要的差异。