换行符不一致问题终极处理方案——gitattributes
官方文档: https://git-scm.com/docs/gitattributes
这里主要讲解 gitattributes 配置解决在团队开发中换行符不一致的问题。通过设置 core.autocrlf 并不能跟随远程仓库进行设置,落到具体的开发者身上,还是会存在换行符不一致的问题。所以最终的处理方案应该是跟随项目提供一个配置文件( .gitattributes),并且给以最高的优先级(像 eslint、husky 等配置一样)
.gitattributes 介绍
.gitattributes 是一个文本文件,文件中的一行定义一个路径的若干个属性,主要用于定义每种文件的属性,以方便 git 帮我们统一管理。
文件格式如下
要匹配的文件模式 属性1 属性2 ...
在.gitattributes 文件的一行中,一个属性(以 text 属性为例)可能有 4 种状态:
text :设置
-text :不设置
text=string :设置值
未声明,通常不出现该属性即可;但是为了覆盖其他文件中的声明,也可以!text
文件中可以定义的属性
text
用于控制行尾的规范性。如果一个文本文件是规范的,则 Git 库汇总该文件(git 服务器上的文件)的行尾总是 LF。对于工作目录,除了 text 属性之外,还可以设置 eol 属性或 core.eol 配置变量。
eol
设置行末字符。
eol=lf ,[回车] :入库时将行尾规范为 LF,检出时行尾不强制转换为 CRLF
eol=crlf,[换行、回车] :入库时将行尾规范为 LF,检出时将行尾转换为 CRLF
diff
我们知道 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 驱动程序显示的。每个驱动程序可以指定一个或多个选项。
如何自定义一个外部的 diff 驱动程序?
diff 驱动程序的定义是在 gitconfig 中完成的,并不是在 gitattributes 文件中,所以严格来说,这里并不适合谈论它。
配置示例
使用
1、为新的 Git 库设置统一的.gitattributes 文件:
在仓库的根目录下创建名为 .gitattributes 的文件。
touch .gitattributes
vi .gitattributes
内容
*.sh text eol=lf
提交到仓库
2、为已有 Git 库设置统一的.gitattributes 文件(重置 GitAttributes):
在上一步的基础上(确保仓库根目录下已经存在.gitattributes 文件)
上面的命令就会根据文件 .gitattributes 中的定义,更新文件的结尾行。
任何变更都会自动使用指定文件的文件结尾行格式。
下一步,可以通知团队成员或者协作者去执行 Git 属性重置的命令即可。
3、为所有 Git 库设置统一的.gitattributes 文件:
参考文档:
https://www.jianshu.com/p/fa4d5963b6c8
我是 甜点cc
热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。
希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。
版权声明: 本文为 InfoQ 作者【甜点cc】的原创文章。
原文链接:【http://xie.infoq.cn/article/562d2808af4c2c866c9919bf6】。文章转载请联系作者。
评论