Dealing with line endings (Windows)

如果你正在使用Git在GitHub上和别人协作的话,确保Git处理行结束符的配置已经正确配置了。

每次在键盘上按下return键时,实际上你正在插入一个称之为行结束符(line ending)的不可见字符。由于历史的原因,不同的操作系统处理行结束符的方式的不一样的。

当你查看一个文件的变更时,Git会以它自己的方式处理行结束符。因为你在项目中使用Git和GitHub进行协作,Git可能产生预料外的结果。比如你在Windows系统上工作,而你的协作者是在OS X上做的变更。

针对行结束符的全局设定

git config core.autocrlf命令被用来改变Git处理行结束符的方式。它接受一个单一的参数。

在Windows中,简单地传递true给这个配置。比如:

$ git config --global core.autocrlf true
# Configure Git on Windows to properly handle line endings

每个库的设定

你可以选择通过配置一个特殊的.gitattributes文件在每个库的基础上配置Git管理行结束符的方式。这个文件被提交给库并且覆盖一个各自的core.autocrlf设置,确保所有用户行为的一致性,而不管他们的Git设置。.gitattributes文件的优势是你的配置和你的库相关。你不需要担心你的协作者是否和你有相同的配置。

.gitattributes文件必须在库的根目录创建并像其他文件一下提交。

.gitattributes文件就像包含两列的表:

左边是给Git去匹配的文件名。

右边是Git将会用于文件的行结束符配置。

.gitattributes 文件例子,使用它作为你的库的模板:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto # Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text # Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf # Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

你注意到文件被 *c,*.sln,*.png匹配,一个空格分割,然后是设置,text,text eof=crlf,binary。

下面是一些可能的设置:

text=auto Git以它认为最好的方式处理文件。这是个好的默认选项。

text eof=crlf 在checkout时,Git总是将文件结束符转换为CRLF。对于必须保留CRLF结尾的文件,即便是在Linux或OS X中,你也应该使用它。

text eof=lf 在checkout时,Git总是将文件结束符转换为LF。对于必须保留LF结尾的文件,即便是在Windows中,你也应该使用它。

binary Git会理解指定的文件不是文本,它就不会尝试去改变它们。这个设定是-text -diff 的别名。

在变更行结束符设置后刷新库

在你设定core.autocrlf配置,提交.gitattributes文件之后,你可能发现Git想去提交你未变更的文件。此时,Git是想为你改变每个文件的行结束符。

自动配置你的库的行结束符的最好方法是首先用Git备份你的文件,删除你的库(除了.git目录),然后立即恢复所有文件。

1.在Git中保存当前的文件,那么你的工作就不会丢失。

$ git add . -u
$ git commit -m "Saving files before refreshing line endings"

2.删除index,强制Git再扫描工作目录。

$ rm .git/index

3.重写Git的index,获取新的行结束符。

$ git reset

4.显示重写后的规范化文件 。

$ git status

5.将你变更的文件复原,准备提交。可以用这个机会检查哪些文件没有被改变。

$ git add -u
# It is perfectly safe to see a lot of messages here that read
# "warning: CRLF will be replaced by LF in file."

6.重写.gitattributes 文件。

$ git add .gitattributes

7.将你的改变提交到库中。

$ git commit -m "Normalize all the line endings"

测试

1.在Windows中创建一个文本文件file1.txt,提交,push

2.在Linux中git clone,看到文件行结束符是CRLF

3.添加.gitattributes文件,设置Git以它认为适当的方式处理行结束符。直接commit,push

4.在Linux中git clone,看到文件行结束符依然是CRLF

5.按照【在变更行结束符设置后刷新库】设置后,在Linux中git clone,看到文件行结束符变为LF

6.强制.txt设置为LF

7.按照【在变更行结束符设置后刷新库】设置后 以及 在Windows中创建一个文本文件file2.txt,提交,push

8.工作目录中的file1.txt,file2.txt还是CRLF,但是在Windows另一个文件夹中git clone,它们的行结束符变为LF。

似乎在checkout时,文件的行结束符可以保证和配置中一致,但是原来的工作目录中似乎并没有改变。

Git处理 行结束符的更多相关文章

  1. [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF[ git 处理和修改行结束符(CRLF和LF)]

    我自己的设置是: [core] autocrlf = false[core] safecrlf = true 取消自动转换CRLF(上图中选的是commit as is),但是有提交前混用检查 本人用 ...

  2. Git命令行(转用于学习和记录)

    Git命令行介绍和使用说明(持续更新) 参见:<Git 中文简体教程> 一. 命令“git”或者“git help”查询常用命令 [add]: “git add”——不但是用来添加不在版本 ...

  3. Git基本命令行操作 (转)

    Git远程操作详解   作者: 阮一峰 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和 ...

  4. windows下使用TortoiseGit代替Git命令行操作

    windows下使用TortoiseGit代替Git命令行操作 大家在使用svn的时候,都非常喜欢使用小乌龟,也就是TortoiseSVN:那么git也有小乌龟版本,即TortoiseGit. 1.安 ...

  5. git命令行工作的正确姿势

    git命令行创建并提交新分支到mater分支的常规步骤 git branch new_branch git status 查看修改的文件 git add changed_files git commi ...

  6. 【重要】使用Git命令行上传到GitHub上

    [本人GitHub账号:] 用户名:chenhongshuang 密码:shuangshuang6300 邮箱:2452420371@qq.com 进入GitHub账号后 1·新建项目文件名称例dem ...

  7. git 命令行

    在使用 git 命令行之前需要下载安装软件官方网站:https://git-scm.com/window 或者 mac 等其它版本自行下载 使用方法一:安装后在项目文件夹中右键菜单会有个 Git Ba ...

  8. 【转】Git 代码行统计命令集

    查看git上个人代码量 git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; su ...

  9. git命令行工作环境配置【转】

    转自:http://www.cocoachina.com/ios/20171115/21163.html 本文为CocoaChina网友whf5566投稿 前言 笔者一直使用git的图形化工具sour ...

随机推荐

  1. ASP.net通过WebBrowser取得AJAX后的网页

    今天  Shih-Min 问我说,假设网页一开始是AJAX 会载入一些资料,但是透过WebClient 去抓 抓到都是JavaScript 跟 AJAX 的原始码,有办法可以抓到AJAX 取完值之后的 ...

  2. Linux操作系统下/etc/hosts文件配置方法

    1.关于/etc/host,主机名和IP配置文件 Hosts - The static table lookup for host name(主机名查询静态表) hosts文件是Linux系统中一个负 ...

  3. 第一百七十六节,jQuery,插件

    jQuery,插件 学习要点: 1.插件概述 2.验证插件 3.自动完成插件 4.自定义插件 插件(Plugin)也成为 jQuery 扩展(Extension),是一种遵循一定规范的应用程序接口编 ...

  4. html中div获取焦点,去掉input div等获取焦点时候的边框

    经测试只有在IE chrome才会在获取焦点时有边框 使用CSS div{ outline:none; } DIV焦点事件详解 --[focus和tabIndex]​ 摘自:http://my.osc ...

  5. CImg的使用,入门

    CImg的使用: const char *imageIN="image.jpg" const char *imageOUT="imgeout.jpg" CImg ...

  6. dedecms代码详解 很全面

    dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...

  7. Observable观察者模式的使用

    今天我们公司封装的类中没有加上Observable观察者模式,但是很多地方需要用到Observable观察者模式 接下来就向大家介绍一下我的使用吧! 在介绍之前我们写了一个方法 public clas ...

  8. 构造三层时报错“程序 “D:\MyTest\....”不包含适合于入口点的静态"Main"方法”

    错误 1 程序“D:\MyTest\EBookShop\Model\obj\x86\Debug\Model.exe”不包含适合于入口点的静态“Main”方法 原因:原来创建项目的时候,用的是“空项目” ...

  9. 《从零开始学Swift》学习笔记(Day 40)——析构函数

    原创文章,欢迎转载.转载请注明:关东升的博客 与构造过程相反,实例最后释放的时候,需要清除一些资源,这个过程就是析构过程.在析构过程中也会调用一种特殊的方法deinit,称为析构函数.析构函数dein ...

  10. Xmind 8 update 4 破解教程(破解补丁+破解步骤+下载地址)

    一.原始教程 原教程很详细,直接参考: http://www.voidcn.com/article/p-yyybmcqq-bnz.html 若无法访问请点击:http://df1551e3.wiz03 ...