Git无法在使用LF的Linux上签出使用CRLF存储的文件

时间:2019-06-11 14:40:14

标签: git eol core.autocrlf

我正在从Linux上的https://github.com/winlibs/libjpeg中签出一个第三方项目“ libjpeg”(这只是一个例子,实际上我在许多其他项目中也遇到同样的问题)。我有以下Git线尾配置。

我仅配置了全局设置(设置为以LF行结尾的结帐):

$ git config --system -l | grep core
core.eol=lf
core.autocrlf=false

$ git config --global -l | grep core
core.eol=lf
core.autocrlf=false

没有关于行尾的本地(回购)设置。

我阅读了有关Git行结尾配置的这篇文章:https://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line,我认为我的配置应该给我Linux上所有文本文件的LF。但是,它不起作用。我在工作区中得到CRLF。例如:

~/gitclonetest/libjpeg$ file libjpeg.map
libjpeg.map: ASCII text, with CRLF line terminators
~/gitclonetest/libjpeg$ cat -v libjpeg.map
LIBJPEG_9.0 {^M
  global:^M
    *;^M
};^M

有人可以帮助我了解我所缺少的吗?我的目标是在Linux主机上将所有文本文件(用于任何项目)自动转换为LF。

更新:目标是将Git配置为在装有LF的Linux主机上签出,即使随后文件已与CRLF一起存储在存储库中。

3 个答案:

答案 0 :(得分:2)

问题是您将core.autocrlf设置为true。该文档说:

  

将此变量设置为“ true”与在所有文件上将text属性设置为“ auto”以及将core.eol设置为“ crlf”相同。如果要在工作目录中包含CRLF行尾,并且存储库中包含LF行尾,请设置为true。

您绝对不希望在Unix或Linux系统上将该变量设置为true;除非您使用的是Windows系统(甚至还有更好的选择),否则应将其设置为false

答案 1 :(得分:1)

您很有可能设置了一些标志来告诉git搞乱EOL格式(这些标志一团糟)。如果您不想让git弄乱他们,可以通过将其添加到.gitattributes中来实现:

* -text

这样,当您添加或签出文件时,git会弄乱文件。如果您需要其他类型的东西(例如真正的自动EOL转换),则可以在此处检查可用的东西。

https://git-scm.com/docs/gitattributes

无论哪种方式,请避免使用您在问题上使用的标志。他们是一团糟。

答案 2 :(得分:1)

Old, but still correct answer关于Git中的EOL头痛

简而言之:

core.autocrlf = false 
core.eol = native

将在所有操作系统上产生正确的EOL