写点什么

换行符不一致问题终极处理方案——gitattributes

作者:甜点cc
  • 2022-10-25
    河南
  • 本文字数:1959 字

    阅读完需:约 6 分钟

官方文档: https://git-scm.com/docs/gitattributes


这里主要讲解 gitattributes 配置解决在团队开发中换行符不一致的问题。通过设置 core.autocrlf 并不能跟随远程仓库进行设置,落到具体的开发者身上,还是会存在换行符不一致的问题。所以最终的处理方案应该是跟随项目提供一个配置文件( .gitattributes),并且给以最高的优先级(像 eslint、husky 等配置一样)

.gitattributes 介绍

.gitattributes 是一个文本文件,文件中的一行定义一个路径的若干个属性,主要用于定义每种文件的属性,以方便 git 帮我们统一管理。

文件格式如下

要匹配的文件模式 属性1 属性2 ...


在.gitattributes 文件的一行中,一个属性(以 text 属性为例)可能有 4 种状态:


  1. text :设置

  2. -text :不设置

  3. text=string :设置值

  4. 未声明,通常不出现该属性即可;但是为了覆盖其他文件中的声明,也可以!text

文件中可以定义的属性

  1. text


用于控制行尾的规范性。如果一个文本文件是规范的,则 Git 库汇总该文件(git 服务器上的文件)的行尾总是 LF。对于工作目录,除了 text 属性之外,还可以设置 eol 属性或 core.eol 配置变量。


  1. eol


设置行末字符。


eol=lf ,[回车] :入库时将行尾规范为 LF,检出时行尾不强制转换为 CRLF


eol=crlf,[换行、回车] :入库时将行尾规范为 LF,检出时将行尾转换为 CRLF



  1. 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 文件中,所以严格来说,这里并不适合谈论它。

配置示例

*           text=auto  # 文件的行尾自动转换。如果是文本文件,则在文件入Git库时,行尾自动转换为LF。如果已经在入Git库中的文件的行尾是GRLF,则文件在入Git库时,不再转换为LF。
*.txt text # 对于.txt文件,标记为文本文件,并进行行尾规范化。
*.jpg -text # 对于`.jpg`文件,标记为非文本文件
*.vcproj text eol=crlf # 对于.vcproj文件,标记为文本文件,在文件入Git库时进行规范化,行尾转换为LF。在检测到出工作目录时,行尾自动转换为GRLF。
*.sh text eol=lf # 对于sh文件,标记为文本文件,在文件入Git库时进行规范化,即行尾为LF。在检出到工作目录时,行尾也不会转换为CRLF(即保持LF)。
*.py eol=lf # 对于py文件,只针对工作目录中的文件,行尾为LF。
*.bat text eol=crlf # 无格式的文本文件,保证 Windows 的批处理文件在 checkout 至工作区时,始终被转换为 CRLF 风格的换行符;
复制代码

使用

1、为新的 Git 库设置统一的.gitattributes 文件:

在仓库的根目录下创建名为 .gitattributes 的文件。

  1. touch .gitattributes

  2. vi .gitattributes

内容

*.sh text eol=lf

  1. 提交到仓库


git add .git commit -m "add: 新增.gitattributes配置"git push
复制代码

2、为已有 Git 库设置统一的.gitattributes 文件(重置 GitAttributes):

在上一步的基础上(确保仓库根目录下已经存在.gitattributes 文件)


git rm --cached -rgit reset --hard
复制代码


上面的命令就会根据文件 .gitattributes 中的定义,更新文件的结尾行。


任何变更都会自动使用指定文件的文件结尾行格式。


下一步,可以通知团队成员或者协作者去执行 Git 属性重置的命令即可。

3、为所有 Git 库设置统一的.gitattributes 文件:

git config --get core.attributesFilegit config --global --get core.attributesFile
复制代码


参考文档:


  1. https://blog.csdn.net/qq_35425070/article/details/106883833

  2. https://www.jianshu.com/p/fa4d5963b6c8


我是 甜点cc


热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。


希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

发布于: 刚刚阅读数: 4
用户头像

甜点cc

关注

看见另一种可能 2020-04-30 加入

欢喜勇猛

评论

发布
暂无评论
换行符不一致问题终极处理方案——gitattributes_JavaScript_甜点cc_InfoQ写作社区