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中会出现行尾不一致的信息. 我的开发 ...
随机推荐
- org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/usr/local/spark/zytdemo
意思说在 hdfs://localhost:9000/usr/local/spark/zytdemo找不到响应的文件,我们可以分析的得到他并不是加载本地文件,而是区hdfs上查找. 这是由于我们在之前 ...
- AI视频风格转换:Stable Diffusion+EBSynth
这次转换的视频还比较稳定,先给大家看下效果. 这里传不了视频,还是放到盘盘了:https://www.aliyundrive.com/s/5mzfjLViyDa 书接上文,在上一篇文章中,我们首先使用 ...
- Git练习网址
爲了方便学习git指令,让新手们更容易地理解,所以推荐一些git练习和博文网址 推荐的网址如下 网址一:Learn Git Branching! https://learngitbranching.j ...
- python=2.7-not available from current channels
现象 使用miniconda3创建python2的环境 Collecting package metadata (current_repodata.json): done Solving enviro ...
- AcWing 4797. 移动棋子题解
算出数值为 \(1\) 的点离 \((3, 3)\) 的距离即可. #include <iostream> #include <cstring> #include <al ...
- Spring Boot 启动流程追踪(第一篇)
1.初始化 SpringApplication public SpringApplication(ResourceLoader resourceLoader, Class<?>... pr ...
- 618京东到家APP-门详页反爬实战
一.背景与系统安全需求分析 1. 系统的重要性 上图所示是接口所属位置.对电商平台或在线商店而言,分类查商品都是很重要的,通过为用户提供清晰的商品分类,帮助他们快速找到所需产品,节省浏览时间,提升购物 ...
- C++的动态分派在HotSpot VM中的重要应用
众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...
- Hadoop集群模式安装笔记
前言 Hadoop集群=HDFS集群+YARN集群 特点:两个集群逻辑上分离,通常物理上在一起:并且都是标准的主从架构集群 Hadoop安装 方式一源码编译安装 方式二官方编译安装包 () 环境 Ce ...
- Python面向对象——property装饰器、继承(与python2不同点)、多继承(优缺点、Mixins)、属性查找、多继承带来的菱形问题
文章目录 内容回顾 property装饰器 继承 与python2的差别 多继承 为何要用继承 如何实现继承 属性查找 多继承带来的菱形问题 总结: 作业 内容回顾 1.封装=>整合 人的对象. ...