git 多平台统一换行符

最近工做使用 sourceTree 的时候常常发现,尽管只是很小的代码改动,可是在文件 diff 的区域莫名的多了不少空格,即便选择忽略空格,一项项提交仍有很大概率报错,非常烦恼。最初的想法是经过脚本去除掉空格,但通过一番努力依然没有完全解决问题。java

偶然的,经过对同事提交的文件使用命令行执行diff的时候,发现存在大量的 ^M 符号,考虑到同事使用的是 windows 系统,终于意识到颇有多是换行符的问题。通过排查终于发如今 sublime 中设置了 line Endings 为 windows (CRLF),而做为主力开发的 IDEA 设置为 LF。最终致使了项目换行符混乱。剩余内容为着力于解决问题。git

背景

首先在不一样操做系统中,换行符并不统一,Linux 系统中使用 0x0A(LF), windows 系统中使用 0x0D0A(CRLF), 而 MAC OS 系统起初使用0x0D(CR) 后来和 Linux 系统保持一致。而 git 默认采用 Linux 的换行符(固然这一点并不奇怪)。windows

git 为了解决不一样平台换行符不一致的问题,在 windows 操做系统中默认在检出代码时将 LF 转换为 CRLF,而在提交的时候再转换为 LF,可是看似完美的解决方案在中文环境中却失效了。bash

解决方案

设置 git 全局参数

git 中有三个参数于换行符有关:编辑器

  • eol: 设置工做目录中文件的换行符,有三个值 lf, crlf 和 native(默认,同操做系统)
  • autocrlf:
    • true 表示检出是转换CRLF, 提交时转换为 LF
    • input 表示检出是不转换,提交时转换为 LF
    • false 表示不作转换
  • safecrlf:
    • true 表示不容许提交时包含不一样换行符
    • warn 则只在有不一样换行符时警告
    • false 则容许提价时有不一样换行符存在

配置方法:工具

<!--统一换行符为 lf-->
git config --global core.eol lf
<!--将自动转换关闭,避免转换失败不能不一样进行提交-->
git config --global core.autocrlf false
<!--禁止混用 lf 和 crlf 两种换行符-->
git config --global core.safecrlf true
复制代码

增长配置文件 .gitattributes

虽然经过设置了 git 全局参数解决了问题,可是做为团队协做的话,并不能保证全部人都正确配好了。git 提供了.gitattributes文件解决了这个问题。在项目根目录新建.gitattributes文件,添加一下内容:ui

# Set the default behavior, in case people don't have core.autocrlf set.
* text eol=lf
复制代码

经过这种方式避免有人没有设置 core.autocrlf 参数,而且将该文件加入版本控制中。spa

另外根据须要 .gitattributes 文件能够在项目不一样目录中建立,而一些非文本文件能够设置为二进制文件,不用考虑换行符问题。操作系统

项目已有内容转换换行符

对于项目已有内容如何进行转换呢,推荐使用dos2unix工具,在mac中能够很方便的使用brew安装,而windows系统中git bash也自带了该工具。 以转换项目中 java 源代码为例:命令行

cd <project_path>
find . -type file -name '*.java' -exec dos2unix {} +
复制代码

最后使用编辑器的时候也确保换行符设置正确

相关文章
相关标签/搜索