原帖收藏于IT老兵驿站,传递一个IT老兵凋零前的光和氧。
Git:git diff发现windows下会出现”^M”符号。
前言
在不同操作系统上编译Git仓库的文件,经常在git diff
时发现很多文件的变化是尾部多了一个^M
的符号。这给工作带来很多困扰,研究一下这个问题。
正题
翻到这个帖子:
GitHub suggests that you should make sure to only use \n as a newline character in git-handled repos. There’s an option to auto-convert:
$ git config --global core.autocrlf true
大体翻译:GitHub建议你应该只用\n
来做为新行的开始,用上面那样的设置就可以做到自动的转换,这样也就解决了问题,Git不会再报告差异。
那这是为什么呢?
阅读一下这里所介绍的这个帖子。
If you’re using Git to collaborate with others on GitHub, ensure that Git is properly configured to handle line endings.
Every time you press return on your keyboard you’re actually inserting an invisible character called a line ending. Historically, different operating systems have handled line endings differently.
When you view changes in a file, Git handles line endings in its own way. Since you’re collaborating on projects with Git and GitHub, Git might produce unexpected results if, for example, you’re working on a Windows machine, and your collaborator has made a change in OS X.
这里大概是说每个操作系统有自己的换行符(就是当你按下”回车”后,系统会自动插入一些不可见的符号来表示一行的结束),Linux
和Mac
都是使用LF
,Windows
则是CRLF
,这样就造成了差异。
Git会对此进行一些处理,但是做什么处理呢?这里没有说清楚,只是说要用
git config core.autocrlf
来控制,和上面说的是一样的,但是原理还是没有搞明白。
只好来看官网。
core.autocrlf
Setting this variable to “true” is the same as setting the text attribute to “auto” on all files and core.eol to “crlf”. Set to true if you want to have CRLF line endings in your working directory and the repository has LF line endings. This variable can be set to input, in which case no output conversion is performed.
这个变量设置为true
等同于在所有文件上设置text attribute
为auto
并且把core.eol
设置为crlf
。设成true
, 如果你的工作空间用的是CRLF
作为行结束符,同时仓库用的是LF
行结束符。这个变量也可以设置成input
,这样在输出时就不做转换了。
对上面说的core.eol
又不明白了,继续查看:
core.eol
Sets the line ending type to use in the working directory for files that have the text property set when core.autocrlf is false. Alternatives are lf, crlf and native, which uses the platform’s native line ending. The default value is native. See gitattributes[5] for more information on end-of-line conversion.
这个变量是用来设置行结束符的,在core.autocrlf
是false
的时候。可以设置成lf
,crlf
和native
, native
是说使用当前平台自己的行结束符。
到这里,大体就明白了,还留有一个问题,就是attribute
的问题,留在下一次来研究。