首页 程序笔记 Git 行尾设置须知

Git 行尾设置须知

1 背景

远端文件拉取到本地后,会根据本地机器的操作系统、或文件编辑器,修改文件内容的行尾。例如远端代码为适配其代码托管的宿主、存储服务器与编译构建环境,通常采用 LF 作为行尾,符合 Linux 文件系统习惯。而本地为 Windows 的机器则应在获取文件后将行尾从 LF 转换为 CRLF,适配 Windows 文件系统习惯。在本地做完文件修改进行提交,并准备推送回远端,行尾则应从 CRLF 转换回 LF。而本地为 Linux 的机器则无需对行尾做任何转换,始终以 LF 为行尾。

如何使文件的行尾在合适的环境使用合适的格式

  • 避免不合适的格式出现在远端,如以 CRLF 行尾的文件推送至服务器。
  • 避免行尾因本地环境的不同,而无法达成统一,在远端被反复来回修改。
  • 避免行尾的适配转换被识别为常规的变更,影响其他文件内容变更的跟踪。
  • 避免文件行尾格式不正确导致无法在特定系统中被执行,如 *.bat 需要 CRLF 行尾在 Windows 中执行,*.sh 需要 LF 行尾在 Linux 中执行。

这就需要能够自动进行行尾设置的工具来帮忙。恰巧 git / git for windows 内置提供此类设置功能。

2 行尾设置

2.1 通用

在仓库的根目录下使用 .gitattributes 文件设置行尾,此设置将直接影响远端对于文件行尾的应用,从而全局的影响所有从远端拉取文件到本地的开发人员。此处需要单独为 *.bat 和 *.sh 设置其在远端存储时所用的行尾,因为这两类文件的行尾设置会直接影响文件是否能够执行,其他文件则不受影响,如 *.cs 即使使用 LF 行尾仍然能够正常的编译构建。

* text=auto*.bat text eol=crlf
*.sh text eol=lf

2.2 本地机器为 Windows

每位开发者的本地环境,通过 .gitconfig 文件设置行尾,仅影响的是本地开发环境,需要每位开发者自行配置。可能有其他更为优秀、妥当且不算复杂的方案,可以避免要求每位开发者配置本地环境,但目前对于 Windows 开发者来说,配置本地环境还是最为简单有效的方案。

[core]
	autocrlf = true
	eol = lf

之所以需要设置 core.autocrlf=true,是因为对于 Windows 用户而言,无论文件创建时是 LF 还是 CRLF,都希望拉取到本地时文件能够适配 Windows 而将 LF 的文件自动转换为 CRLF,当然 *.sh 文件除外。

  • 而不设置 core.autocrlf 将影响
    • 文件行尾及文件的一致性,导致本地变更和工作树、和索引比较时,出现行尾的变更
    • 无法保障文件可执行性
    • 无法保障文件在本地 Windows 和远端 Linux 能够正常读写,编辑时可能会有编码问题,出现乱码
  • 或设置 core.autocrlf=input 所表达的和 * text=auto 理论一致,其会在推送远端时将行尾转换为 LF,从远端拉取到本地时会保持文件创建时的原始行尾。造成本身就是 LF 行尾的文件在本地仍然是 LF,不会转换为 CRLF,影响文件在 Windows 系统中的编辑。

之所以要设置 core.eol=lf,是为了保障仓库内的行尾一致使用 LF,而不是某些文件 LF,某些 CRLF,某些混合。

2.3 本地机器为 Linux / OS X

无需进行 Windows 中所作的配置。

2.4 应用行尾到已经克隆的到本地工作树的仓库

本地工作树可能已经有很多文件出现混合行尾、行尾不正确的情况,此时想要应用新的行尾配置,应当执行行尾变更,推送到远端,并重新克隆。

git add --renormalize .# 提交推送到远端# 将远端仓库重新克隆下来的行尾便全部正常

2.5 查看当前本地工作树内文件的行尾

# 查看所有文件git ls-files --eol# 查找文件行尾中有混合了 LF 和 CRLF 的文件git ls-files --eol | findstr mixed
git ls-files --eol | grep mixed
# i 表示 index,可以视作远端行尾# w 表示 working tree,可以视作本地行尾### 行尾可能的值有 lf、crlf、mixed,mixed 表示一个文件中行尾既有 lf 又有 crlf,应避免 #### attr 表示 .gitattributes 中的行尾设置# 最后一列是文件名称,即当前执行 git ls-files 指令所在目录下的相对路径i/lf    w/crlf  attr/text=auto          .gitattributes

3 行为表现

当正确进行了行尾设置后

  • 文件拉取到本地做了行尾转换后,git 并不会认为文件产生了变更,在 git 变更中不会出现新的变更记录。
  • 对于做出常规变更的文件,git 在将文件与未修改的版本进行比较时,会将本地文件的行尾自动转换为远端所设置的行尾再进行比对,不会将行尾的变更纳入为实际的变更中来。

行尾的变化对用户来说将变得无感。

4 其他注意事项

单独在 .editorconfig 设置,如所有文件类型或 *.cs 文件类型设置行尾为 CRLF,并不能够影响 git 的行为,仍然无法避免 git 将行尾修改识别为常规变更,并且导致 CRLF 行尾的文件被推送到远端,在远端也能够看到行尾的变更。该设置仅能够为 IDE 如 VS 将在保存文件时检查行尾,将行尾不是 CRLF 的设置为 CRLF。

5 参考资料

  • CRLF vs. LF: Normalizing Line Endings in Git
  • .gitattributes Best Practices
  • merge.renormalize
  • Configuring Git to handle line endings
  • Git – Difference Between HEAD, Working Tree and Index
2

站心网

1 背景远端文件拉取到本地后,会根据本地机器的操作系统、或文件编辑器,修改文件内容的行尾。例如远端代码..

为您推荐

TinyMCE 富文本编辑器常用菜单设置

TinyMCE是一款流行的开源富文本编辑器,广泛应用于网页内容管理系统(CMS)和各种Web应用程序中。它提供了丰富的功能和高度可定制性。下面将介绍一些常用的菜单设置:工具栏:显示或隐藏工具栏。可以通过配置文件中..

EntityFramework SQLite 为时间字段设置默认值为当前时间

在使用 Entity Framework Core 和 SQLite 时,可以通过以下步骤为时间字段设置默认值为当前时间:方法一:在模型配置中设置默认值你可以在 DbContext 的 OnModelCreating 方法中,通过 Fluent API 配置默认值:prote..

c#无损压缩图片代码,可设置压缩质量

之前写过一篇文章《使用htmlagilitypack+xpath抓取网页内容示例》,提到使用htmlagilitypack抓取网页信息。想做一个网络爬虫,但是想把网页上的图片也下载到本地,于是写了下载图片的功能。但是第三方网站上的图片大..

.NET 6 跨域设置

在 .NET 6 中,跨域设置相对于以前版本有了一些改变,主要是为了提供更好的安全性和灵活性。跨域资源共享(CORS)是一种安全机制,允许Web应用程序从不同域(即不同的网站)访问其资源。以下是在 .NET 6 中进行跨域..

ASP.NET设置允许上传文件大小

在 ASP.NET 中,你可以通过修改 web.config 文件中的maxRequestLength 配置来设置允许上传文件的大小限制。这可以帮助你控制用户上传的文件大小,以防止不必要的服务器资源消耗和安全风险。以下是设置上传文件大小限..

.NET Core设置允许上传文件大小

在 .NET Core 中,你可以通过配置应用程序的 Startup.cs 文件来设置允许上传文件的大小限制。以下是设置上传文件大小限制的步骤:打开你的 ASP.NET Core 项目的 Startup.cs 文件。在 ConfigureServices 方法中,添加..

程序员开发人员常用工具和网站

给大家分享一些程序员开发人员常用工具和网站,我相信这里总有一款工具适合你。排名不分先后~Visual Studio CodeVisual Studio Code官网地址:https://code.visualstudio.com/Visual Studio Code重新定义和优化了代..

类似sms-activate的国外手机验证码接码平台

很多网站需要通过手机验证码才能注册成功,例如最近大火的ChatGPT的官网OpenAI只能使用国外手机号注册。这里推荐几个可以接收国外手机验证码的平台。sms-activatehttps://sms-activate.org/cn站点推荐:ChatGPT手机..

百度文心一言邀请码如何获得?

3月16日下午,百度于北京总部发布了新一代大语言模型、生成式AI产品文心一言。首批用户即可通过邀请测试码,在文心一言官网体验产品,后续将陆续开放给更多用户。邀请码申请方式请往下看。百度文心官网地址:https://..

免费申请SSL证书的网站教程推荐

现在有很多平台可以申请的免费SSL证书让你的网站提供https服务。一些云服务器平台可能也会有一些免费SSL证书的服务。免费SSL证书安全吗?免费SSL证书可以使用,并且在许多情况下是足够安全的。免费SSL证书可以通过Le..

react使用echart图文教程

可以参考ECharts官网的文档:https://echarts.apache.org/handbook/zh/basics/import在React中使用ECharts可以通过以下步骤:安装ECharts库使用npm或者yarn安装ECharts库:npm install echarts --save引入ECharts库..

量化炒股的原理是什么?量化交易策略有哪些?

量化炒股是一种利用计算机程序和数学模型来进行投资决策的方法。它的原理是通过分析历史市场数据、价格走势、技术指标等多种因素,构建数学模型,用以预测未来股市走势和行情。这些模型能够自动执行交易,以实现更高..

头条搜索站长工具网站提交

头条搜索站长平台官网地址:https://zhanzhang.toutiao.com/头条站长是一款提供网站分析和优化建议的工具,可以帮助站长了解其网站的流量情况、用户行为、页面质量等信息,以便对网站进行优化和改进。它的功能和百度..

类似ChatGPT的AI产品有哪些?

在自然语言处理领域,有一些可以替代ChatGPT的工具和框架,以下是一些比较流行的:Transformer-XL:Transformer-XL是由CMU和Google共同开发的自然语言处理模型,具有较好的上下文理解能力和处理长文本的能力。该模型..

echars k线图tooltip formatter没有执行

使用echars生成k线图时,参考官网的示例发现无法修改tooltip的内容,经过研究发现官网示例代码是不正确的。以名为[K 线图刷选]的K线图为例,因为它的示例里有tooltip formatter的实现代码,但是实际上是没有执行的。..

网站域名年龄对SEO的影响

网站域名年龄对SEO的影响网站域名的年龄可以对搜索引擎优化(SEO)产生影响。一般来说,具有较长历史的域名更容易被搜索引擎认为是可信赖的和有价值的网站。这是因为一个域名在互联网上存在的时间越长,它就越有可能..

AI文本工具网站有哪些?

AI 文本工具是一类利用人工智能技术实现自然语言处理的在线工具。以下是一些常见的 AI 文本工具站,以及它们的简单介绍和官方网址:OpenAI GPT-3 PlaygroundOpenAI GPT-3 Playground 是由 OpenAI 推出的一个在线 AI ..

Quartz.NET-面向.NET的开源作业调度系统

什么是Quartz.NETQuartz.NET是一个流行的开源作业调度框架,可以用于在.NET应用程序中进行作业调度。它是Quartz调度器的.NET实现,提供了高度可定制化的作业调度功能,支持复杂的作业调度需求。Quartz.NET可以让您创..

使用剪映图文成片功能将文章转为视频教程

最近因为ChatGPT的火爆也带火了很多AI工具,今天试用了剪映,它有一个图文成片的功能很强大,我用它尝试把一篇文章转为视频。首先准备文章内容,我直接复制了网站里的这边文章:https://www.leavescn.com/Articles/C..

黑客常用哪些编程语言?

黑客常用的编程语言并不一定只有一种,它们选择的编程语言通常取决于攻击的目标和攻击的方式。以下是一些黑客经常使用的编程语言:Python:Python 是一种通用编程语言,它的简洁性和易用性使得它成为黑客攻击中的一..

发表回复

返回顶部