【问题标题】:Make git Not Care About Line Endings of Files in My Working Tree让 git 不关心我的工作树中文件的行尾
【发布时间】:2014-09-23 22:59:08
【问题描述】:

让我澄清一下:我希望git 在签入/提交时不关心行尾是 CRLF 还是 LF。我知道目前没有办法让git 不在乎文件是否有 mixed 行结尾,尽管我希望有一个解决方法,以防万一;我只是希望它不关心文件中的所有行尾都是 CRLF 还是 LF。

我最近在我的系统.gitattributes 文件中设置了许多文件扩展名/etc/gitattributes(使用MSysGit),以告诉git 哪些扩展名通常是文本或二进制。对于我希望git 认为是文本的大多数文件,我设置了扩展名

*.extension text=auto

因为这会告诉git 具有这些扩展名的文件应该具有通用系统行结尾。现在我对这个决定感到遗憾,因为我看到有多少文件出于某种原因自动给出了 LF 行结尾而不是 CRLF。现在,在修改了这个设置和其他设置之后,我遇到了类似于

的错误
$ git add -A && git commit -m "signup/in/out now possible through passport"
fatal: LF would be replaced by CRLF in node_modules/mongoose/node_modules/ms/package.json

在我尝试签入的很多文件上。在这种情况下,似乎是 npm 导致这些文件被创建为 LF 而不是 CRLF,但我确信还有许多其他原因。

说实话,我个人并不关心特定文件的行尾类型,只要我可以在我选择的编辑工具中读取和编辑这些文件,因为绝大多数时候除了行尾之外,行尾没有任何特殊功能。如果真的很重要,我可以随时使用unix2dosdos2unix 进行快速转换。但是,git 对行尾的挑剔是出了名的,我不希望它意外地将文本文件标记为二进制文件,反之亦然,因此我一直在更改所有这些默认值。

我如何使git 将所有文本文件签入为 LF 行结尾的文件,并将它们签出为 CRLF,但不在乎它们在我的实际工作树中是否有 CRLF 或 LF 结尾? 或者,有没有办法让git 在我的工作树中也将所有以 LF 结尾的文本文件转换为 CRLF,而不是发出警告并放弃?

编辑看来我的问题不在于我的gitattributes 文件,而在于我的gitconfig 中的core.safecrlf 设置。

【问题讨论】:

    标签: windows git line-endings


    【解决方案1】:

    我的问题似乎与我在gitcore.safecrlf 中设置的另一个配置设置有关。根据对this question 的已接受答案,该答案在有关该主题的几篇博客文章中澄清了一些事情,此设置检查git 正在签入或签出的文件是否会更改其行尾。如果它确定它们将被更改,它将中止操作。这个设定我以前不明白,现在玩了一会儿,我想我明白了。

    据我所知,此设置似乎仅适用于在您的gitattributes 中未指定扩展名的二进制文件,以及行尾实际上在您将要使用的语言中具有含义的文件用于编辑它们。例如,假设该语言的所有文件都具有扩展名.ext。如果这种语言使用计算机用来表示 LF 的符号和/或它们用来表示 CRLF 的符号,git 不应转换这些 .ext 文件。我不知道这样的语言,但如果它们存在,并且如果程序员仍然希望git 将用这些语言编写的文件解释为文本,程序员应该在他/她的gitattributes 中设置一个特殊属性,而不是*.ext text

    除了这两种类型的文件,我想不出任何其他情况可以使用core.safecrlf=true。因此,在遇到此类情况之前,我将取消设置此设置,或者设置为 warn

    【讨论】:

      【解决方案2】:

      在您的 .gitattributes 中,只需添加这一行。无论之前是什么,它都会在结帐时将所有行结尾转换为 CRLF。

      * text eol=crlf
      

      看到这个http://git-scm.com/docs/gitattributes

      设置为字符串值“crlf”

      此设置强制 Git 在签入时规范化此文件的行尾,并在签出文件时将其转换为 CRLF。

      【讨论】:

      • 我相信 text=auto 与“eol=lfeol=crlf 或任何 git 感觉就像在当时设置 eol 一样”。设置eol=lf 并没有阻止错误。另外,我已经阅读了该页面,这也是我开始设置所有这些选项的部分原因。
      • 另外,我希望 git 在结帐时将我的文件转换为 CRLF,因为我在 Windows 机器上。
      • 所以设置 text eol=crlf 应该是你想要的,对你有用吗?
      • 不,这将作为 CRLF 签入,这是我不想要的。此外,它仍然无助于错误。
      • 您没有错过我的最后一行,因为我是在您添加此答案后添加的。但是,您确实误解了它:请参阅我之前的评论。
      【解决方案3】:

      git config autocrlf <option>

      It can have options:
      1) true:             x -> LF -> CRLF
      2) input:            x -> LF -> LF
      3) false:            x -> x -> x
      

      【讨论】:

      • 我设置了这个设置。我在玩选项,并尝试取消设置,设置/取消设置core.safecrlf 等,但没有任何效果。
      • 我已经编辑了我的答案!它解释了事情,让你决定!
      • 没用。使用所有这些选项,我仍然得到错误(刚刚添加到我的问题中)。另外,您实际上并没有解释为什么这些选项会有所帮助(不是在这种情况下)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2018-02-22
      • 2017-07-13
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多