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 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 行尾设置须知的更多相关文章
- 2分钟 sublime设置自动行尾添加分号并换行:
18:03 2016/4/162分钟 sublime设置自动行尾添加分号并换行:注意:宏文件路径要用反斜杠/,2个\\会提示无法打开宏文件.不需要绝对路径很简单利用宏定义:1.录制宏:由于是录制动作宏 ...
- Notepad++中设置Windows、Unix、Mac三种行尾换行符格式间的转换
(1)首先,要设置NotePad++能显示换行符,这个才干看到效果, 视图-->显示符号-->显示行尾符. {2}设置行尾符格式:编辑-->档案格式转换-->(可选Window ...
- 去掉行尾的^M
1. 处理掉行尾的^M 在windos下进行linux内核驱动编写,调试成功后需要集成到内核代码中去,所以会通过虚拟机共享文件夹拷贝到内核对应目录,这时候看源码文件还是没有异常的. 当对该文件进行回车 ...
- Hive读取外表数据时跳过文件行首和行尾
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 有时候用hive读取外表数据时,比如csv这种类型的,需要跳过行首或者行尾一些和数据无关的或者自 ...
- markdown上下左右,跳至行尾行首,重设快捷键
概述 用markdown输入代码的时候觉得下面2件事非常不方便: (1)光标上下左右.(需要挪动手去按方向键) (2)光标跳至行尾和行首.(需要动手去按Home和End键) 为了简化,我特地更改了ST ...
- centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标前所有字符 Ctrl+r 搜索命 hash命令 Ctrl+左箭头/右箭头 cd命令 第三节课
centos 目录结构 快捷键 ls命令,alias别名,so:动态库 a:静态库,环境变量PATH,Ctrl+z 暂停命令,Ctrl+a 光标到行首,Ctrl+e 光标到行尾,Ctrl+u 删除光标 ...
- 在DOS行下设置静态IP
A.设置静态IP CMD netsh netsh>int interface>ip interface ip>set add "本地链接" static ...
- 【Pycharm使用者必看】自定义【光标快速定位到行尾】的按键
1.问题描述 使用Pycharm写代码时,有很多比较方便的快捷键,比如:Shift+Enter快速切换到下一行, 但每次切换到多个括号外或者想移动到行尾,就必须按 End 键或者鼠标点击, 这样操作幅 ...
- linux shell 用sed命令在文本的行尾或行首添加字符
转自 http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed ...
- Unity3D脚本行尾(Line Endings)
行尾不一致(inconsistent line endings ) 开发环境 有时候编辑Unity的脚本文件,代码diff之后,或者从svn更新文件之后,Unity中会出现行尾不一致的信息. 我的开发 ...
随机推荐
- Spring-配置文件(引入其他配置文件,分模块开发)
引入其他配置文件 实际开发,Spring的配置文件内容非常多,这就导致了Spring配置很复杂且体积很大,所以可以将配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载 & ...
- Postgresql: 常用配置
允许远程链接postgresql 要允许 PostgreSQL 数据库允许远程连接,需要进行以下配置步骤: 打开 PostgreSQL 的主配置文件 postgresql.conf.通常,该文件位于以 ...
- pip 更新
pip install --user --upgrade pip成功升级
- Vue中 router与route的区别
$route对象 该对象表示当前的路由信息,包含当前URL解析得到的信息.包含当前的路径,参数,query对象等.其常用方法如下所示: $route.path 字符串,对应当前路由的路径,总是解析为绝 ...
- Uncaught TypeError: Failed to set the 'currentTime' property on 'HTMLMediaElement': The provided double value is non-finite.
musicSeekTo: function(value){this.audio.currentTime = this.audio.duration*value; }, musicVoiceSeekTo ...
- npm与package.json的联系
在nodejs编写的脚手架项目中,npm是不可缺少的包管理工具,当使用npm初始化时,会生成package.json文件来对项目进行整体的管理和描述 以下是新建的练习项目中package.json ...
- .Net Web API 006 Controller上传大文件
1.上传大文件的方式 上传大文件就需要一段一段的上传,主要是先在客户端获取文件的大小,例如想一次传256kb,那就按照256kb分割.分割后又两种上传方式. (1)逐个数据段读取,然后调用API上传, ...
- Android13冻结进程分析:如何提高设备性能和用户体验
Android13冻结进程分析:如何提高设备性能和用户体验 本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗. ...
- Health Kit基于数据提供专业方案,改善用户睡眠质量
什么是CBT-I? 中国社科院等机构今年发布的<中国睡眠研究报告2023>内容显示,2022年,受访者的每晚平均睡眠时长为7.40小时,近半数受访者的每晚平均睡眠时长不足8小时(47.55 ...
- el-date-picker 在表单中宽度(width)问题
在使用element-plus的日期选择组件 el-date-picker的时候,发现form表单内的日期选择框并不能跟el-input 一样把宽度撑满.而是要小一圈. 这样在排版中显得不太整齐,但是 ...