让我澄清一下:我希望git
在签入/提交时不关心行尾是CRLF还是LF。我知道目前没有办法让git
不在乎文件是否有混合行结尾,尽管我很想找到一个解决方法,以防万一;我只是希望它不在乎文件中的所有行结尾是CRLF还是LF。
我最近在我的系统.gitattributes
文件/etc/gitattributes
(使用MSysGit
)中设置了许多文件扩展名,以告诉git
哪些扩展名通常是文本或二进制的。对于我希望git
认为是文本的大多数文件,我设置了扩展名
*.extension text=auto
因为这将告诉CCD_ 8具有这些扩展名的文件应该具有通用的系统行结尾。现在我对这个决定感到遗憾,因为我看到有多少文件由于这样或那样的原因,自动以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,但我相信还有很多其他原因。
老实说,我个人不在乎一个特定文件有哪种类型的行尾,只要我能在我选择的编辑工具中阅读和编辑这些文件,因为绝大多数时候,行尾除了是行尾之外,没有任何特殊的功能。如果真的很重要,我总是可以用unix2dos
或dos2unix
进行快速转换。然而,众所周知,git
对行尾非常挑剔,我不希望它意外地将文本文件标记为二进制文件,反之亦然,因此我一直在更改所有这些默认值。
如何使git
将所有文本文件作为LF行结束文件签入,并将其作为CRLF签出,但不关心它们在我的实际工作树中是否有CRLF或LF结尾或者,有没有办法让git
将我的工作树中所有以LF结尾的文本文件也转换为CRLF,而不是发出警告并放弃?
EDIT我的问题似乎不是gitattributes
文件,而是gitconfig
中的core.safecrlf
设置。
我的问题似乎是在git
、core.safecrlf
中设置了另一个配置设置。根据这个问题的公认答案,它在几篇关于这个主题的博客文章中澄清了一些事情,这个设置会检查git
正在签入或签出的文件的行结尾是否会更改。如果它确定它们将被更改,它将中止操作。我以前不理解这个设置,但现在我已经玩了一段时间,我想我确实理解了
据我所知,这个设置似乎只适用于gitattributes
中未指定扩展名的二进制文件,以及行结尾在编辑它们时使用的语言中确实有意义的文件。举个例子,让我们假设该语言中的所有文件都具有扩展名.ext
。如果这种语言使用计算机用来表示LF的符号和/或他们用来表示CRLF的符号,git
不应该转换这些.ext
文件。我不知道有什么类似的语言,但如果它们存在,并且程序员仍然希望git
将用这些语言编写的文件解释为文本,那么程序员应该在他/她的gitattributes
中设置一个特殊的属性,而不是*.ext text
。
除了这两种类型的文件,我想不出还有其他情况可以使用core.safecrlf=true
。因此,在遇到这样的情况之前,我将取消设置此设置,或者可能将其设置为warn
。
在.gitattributes中,只需添加此行。结账时,无论以前是什么,它都会将所有行尾转换为CRLF。
* text eol=crlf
看看这个http://git-scm.com/docs/gitattributes
设置为字符串值"crlf"
此设置强制Git在签入时规范化此文件的行尾,并在文件签出时将其转换为CRLF。
git config autocrlf <option>
It can have options:
1) true: x -> LF -> CRLF
2) input: x -> LF -> LF
3) false: x -> x -> x