让git不关心我的工作树中的文件行结尾

时间:2014-09-23 13:29:48

标签: windows git line-endings

让我澄清一下:我希望git不关心在结账/提交时行结尾是CRLF还是LF。我知道目前没有办法让git不关心文件是否有混合行结尾,尽管我希望能解决这个问题,以防万一;我只是想要不关心文件中的所有行结尾是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-line-ended文件,并将其作为CRLF检查,但不关心它们在我的实际工作树中是否有CRLF或LF结尾?或者,有没有办法让git将所有带有LF结尾的文本文件转换为我工作树中的CRLF,而不是发出警告并放弃?

编辑我的问题似乎与我的gitattributes文件无关,但在我的core.safecrlf中设置了gitconfig

3 个答案:

答案 0 :(得分:0)

我的问题似乎与我在gitcore.safecrlf中设置的其他配置设置有关。根据{{​​3}}的已接受答案,该答案澄清了有关该主题的若干博客文章中的内容,此设置会检查文件git是否正在签入或签出其行结尾是否已更改。如果确定它们将被更改,则会中止操作。我之前没有理解这个设置,但是现在我已经玩了一下,我想我明白了。

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

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

答案 1 :(得分:-1)

在.gitattributes中,只需添加此行即可。无论以前是什么,它都会在结账时将所有行结尾转换为CRLF。

* text eol=crlf

请参阅此http://git-scm.com/docs/gitattributes

设置为字符串值" crlf"

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

答案 2 :(得分:-2)

git config autocrlf <option>

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