如何强制git在windows下使用LF而不是CR + LF?

时间:2010-03-25 16:07:33

标签: git msysgit

我想强制git仅使用LF而不是CR+LF来检出Windows下的文件。我检查了两个配置选项,但我找不到正确的设置组合。

我希望它将所有文件转换为LF并将LF保留在文件上。

备注:我使用了autocrlf = input,但这只是在提交时修复文件。我想强制它使用LF来获取它们。

可能我不是那么清楚:存储库已经在使用LF但是使用msysgit检出的文件正在使用CR+LF而我想强制使用msysgit来获取LF强制Unix行结尾

>git config --list | grep crlf
core.autocrlf=input

6 个答案:

答案 0 :(得分:373)

在Windows中获取LF结尾的正确方法是先将core.autocrlf设置为false

git config --global core.autocrlf false

如果您使用msysgit,则需要执行此操作,因为它在系统设置中将其设置为true

现在git不会做任何行结束规范化。如果您希望签入的文件进行规范化,请执行以下操作:在text=auto中为所有文件设置.gitattributes

* text=auto

并将core.eol设为lf

git config --global core.eol lf

现在你也可以通过运行

将单个repos切换到crlf(在工作目录中!)
git config core.eol crlf

完成配置后,您可能希望git规范化 repo 中的所有文件。为此,请转到repo的根目录并运行以下命令:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

如果您现在希望git也规范化工作目录中的文件,请运行以下命令:

git ls-files -z | xargs -0 rm
git checkout .

答案 1 :(得分:181)

我经常回到这个答案,虽然这些都不适合我。那就是说,对我来说正确的答案是其他人的混合。

我发现的作品如下:

 git config --global core.eol lf
 git config --global core.autocrlf input

对于在设置全局设置后检出的回购,所有内容都将按照回购中的内容进行检出 - 希望LF\n)。在签到时,任何CRLF都会转换为LF

对于您已经签出的现有仓库 - 在仓库中有正确的行结尾而不是您的工作副本 - 您可以运行以下命令来修复它:

git rm -rf --cached .
git reset --hard HEAD

这将删除(rm)递归(r)而不提示(-f),除了您编辑的文件(--cached)之外的所有文件,从当前目录(.)。 reset然后将所有这些文件返回到它们具有真实行结尾的状态(匹配repo中的内容)。

如果你需要在repo中修复文件的行结尾,我建议你抓住一个编辑器,让你像IntelliJ或Sublime Text一样批量完成,但我相信任何一个好的人都可能支持这个。< / p>

答案 2 :(得分:80)

OP在他的问题中补充说:

  

使用msysgit签出的文件正在使用CR+LF,我想伪造msysgit以使用LF

第一个简单步骤仍然在.gitattributes文件中:

*.txt -crlf

,以避免对具有正确eol的文件进行任何crlf转换。

请参阅Best practices for cross platform git config?


但第二个更有力的步骤涉及gitattribute filter driver并添加涂抹步骤

filter driver

每当您更新工作树时,脚本只能针对您在.gitattributes中指定的文件强制执行LF eol和任何其他格式化选项。
如果“clear”脚本没有执行任何操作,您将(提交后)转换文件,完全应用您需要的格式。

答案 3 :(得分:34)

上下文

如果你

  1. 希望强制所有用户拥有文本文件的LF行结尾和
  2. 您无法确保所有用户都更改其git配置
  3. 你可以从git 2.10开始。需要2.10或更高版本,因为2.10 fixed the behavior of text=auto together with eol=lfSource

    解决方案

    .gitattributes文件放在git存储库的根目录中,其中包含以下内容:

    * text=auto eol=lf
    

    承诺。

    可选调整

    您还可以在存储库的根目录中添加.editorconfig,以确保现代工具创建具有所需行结尾的新文件。

    # EditorConfig is awesome: http://EditorConfig.org
    
    # top-most EditorConfig file
    root = true
    
    # Unix-style newlines with a newline ending every file
    [*]
    end_of_line = lf
    insert_final_newline = true
    

答案 4 :(得分:25)

core.autocrlf=input是您想要的正确设置,但您可能必须执行git update-index --refresh和/或git reset --hard才能使更改生效。

core.autocrlf设置为input时,git将不会在结帐时应用换行符(因此如果您在回购中有LF,则会获得LF),但它会确保如果你搞砸并以某种方式在工作副本中引入一些CRLF,它们就不会进入回购。

答案 5 :(得分:0)

您可以在以下位置找到解决此问题的方法: https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

有关如何在Windows上解决此问题的简化说明:

行尾的全局设置 git config core.autocrlf命令用于更改Git处理行尾的方式。它只有一个参数。

在Windows上,您只需将true传递给配置即可。例如: C:> git config --global core.autocrlf为真

祝你好运,希望我能帮上忙。