git用CRLF代替LF

在Windows XP机器上使用bash运行git。 我从SVN中导出了我的项目,然后克隆了一个裸仓库。

然后,我将导出粘贴到裸存储目录中,并执行:

git add -A

然后我得到一个消息列表:

LF将由CRLF取代

这种转换的后果是什么? 这是Visual Studio中的.NET解决方案。


Git有三种处理行结束符的模式:

$ git config core.autocrlf
# that command will print "true" or "false" or "input"

您可以通过向上述命令行添加truefalse的附加参数来设置要使用的模式。

如果core.autocrlf设置为true,这意味着只要你将文件添加到git repo中,git认为它是一个文本文件,它就会将所有CRLF行结束符转换为LF,然后将其存储在提交中。 每当你git checkout一些东西时,所有的文本文件都会自动将它们的LF行结束符转换为CRLF结尾。 这允许使用不同行结束样式的平台开发项目,而不会提交非常嘈杂的声音,因为每个编辑器都会更改行结束样式,因为行尾样式始终始终为LF。

这种方便的转换的副作用,这就是你看到的警告是关于,如果你创作的文本文件最初有LF结尾而不是CRLF,它将像往常一样用LF存储,但是当选中时后来它会有CRLF结局。 对于普通的文本文件,这通常很好。 在这种情况下,警告是“供您参考”,但如果git错误地将二进制文件评估为文本文件,这是一个重要的警告,因为git会破坏您的二进制文件。

如果core.autocrlf设置为false,则不会执行换行转换,因此将按原样检入文本文件。 这通常可以正常工作,只要所有的开发人员都在Linux或全部在Windows上。 但根据我的经验,我仍然倾向于使用混合行结尾的文本文件,最终导致问题。

作为Windows开发人员,我的个人偏好是将设置保持为ON。

有关包含“输入”值的更新信息,请参阅http://kernel.org/pub/software/scm/git/docs/git-config.html。


这些消息是由于Windows上的core.autocrlf默认值不正确造成的。

autocrlf的概念是透明地处理行结束autocrlf转换。 它确实!

坏消息:值需要手动配置。
好消息是:每个git安装只能进行一次(每个项目设置也是可能的)。

autocrlf如何工作

core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:

        repo                     repo                     repo
      ^      V                 ^      V                 ^      V
     /                       /                       /        
crlf->lf    lf->crl      crlf->lf                    /                
   /                       /                       /            

这里crlf =赢式结束标记, lf = unix-style(和mac osx)。

(pre-osx cr在上述三个选项中没有任何影响)

此警告何时显示(在Windows下)

- autocrlf = true如果你在其中一个文件中使用了unix风格的lf (= RARELY),
- autocrlf = input ,如果你有赢风格crlf在文件中的一个(=几乎总是)
- autocrlf = false - 从不!

这个警告是什么意思

警告“LF将被CRLF取代”,说你( autocrlf = true )在提交结账周期后将失去你的unix风格的LF(它将被windows风格的CRLF所取代)。 Git不希望你在Windows下使用unix风格的LF。

警告“CRLF将被LF取代”说,你(有autocrlf = input )在提交 - 结账循环后将失去你的Windows风格的CRLF(它将被unix风格的LF取代)。 不要在Windows下使用input

另一种显示autocrlf如何工作的方式

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

其中x是CRLF(窗口式)或LF(unix式),箭头表示

file to commit -> repository -> checked out file

怎么修

core.autocrlf缺省值在git安装过程中被选中并存储在系统范围的gitconfig( %ProgramFiles(x86)%gitetcgitconfig )中。 还有(按照以下顺序级联):

- 位于~/.gitconfig “全局”(每用户) ~/.gitconfig ,还有一个
- $XDG_CONFIG_HOME/git/config xDG_CONFIG_HOME $XDG_CONFIG_HOME/git/config$HOME/.config/git/config “global”(per-user)gitconfig和
- 在工作目录中的.git/config中的“local”(per-repo)gitconfig。

因此,在工作目录中写入git config core.autocrlf来检查当前使用的值和

- 将autocrlf=false添加到系统范围的gitconfig#per-system解决方案
- git config --global core.autocrlf false #per-user解决方案
- git config --local core.autocrlf false #per-project解决方案

警告
- git config设置可以被gitattributes设置覆盖。
- crlf -> lf仅在添加新文件时发生转换,则不会影响存储在回购站中的crlf文件。

道德 (适用于Windows):
- 如果你打算在Unix下使用这个项目(并且不愿意配置你的编辑器/ IDE使用unix行尾),使用core.autocrlf = true
- 如果您打算仅在Windows下使用此项目(或者您已将您的编辑器/ IDE配置为使用unix行尾),请使用core.autocrlf = false
- 除非你有足够的理由(例如,如果你在Windows下使用unix实用程序或者遇到makefile问题),否则不要使用core.autocrlf = input

PS 安装git for Windows时选择什么?
如果您不打算在Unix下使用您的任何项目,请不要同意默认的第一个选项。 选择第三个( 原样签出,按现状提交 )。 你不会看到这个消息。 永远。

PPS我的个人偏好是将编辑器/ IDE配置为使用Unix风格的结尾,并将core.autocrlf设置为false


如果您已经检出代码,则这些文件已经被编入索引。 更改你的git设置后,你应该刷新索引

git rm --cached -r . 

并用git重新编写git索引

git reset --hard

https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings

链接地址: http://www.djcxy.com/p/92361.html

上一篇: git replacing LF with CRLF

下一篇: No submodule mapping found in .gitmodules for path