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


335

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

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

备注:我曾经使用过,autocrlf = input但这只是在您提交文件时修复文件。我想强迫它使用它们LF

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

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

2
autocrlf=input是正确的选项。当然,cr+lf在将文件cr+lf添加到git之前,它并不能保护您免受存储库中真正包含的文件或使用其他工具创建的文件的影响。您有什么问题无法解决?
CB Bailey 2010年

2
存储库中的文件已经在使用,LF但是当我在Windows下获取它们时,msysgit会将其转换为CR+LF
索林2010年

您的配置一定有问题;我刚刚在msysgit安装上对此进行了测试。随着autocrlf设置input,Git是离开lf单独换行。您可以发布的输出git config吗?
CB Bailey 2010年

1
在这种情况下,我建议您记录一个错误。最好指向展示您问题的测试存储库,并包括重现步骤,因为您看到的行为肯定是错误的(但我无法重现)。
CB Bailey 2010年

1
一个小技巧是还要确保您在自己认为的'git'上运行git命令。例如,您可能在Windows上安装了git,而在cygwin上安装了git,因此请确保已设置正确的git config。
lfred

Answers:


106

OP在他的问题中添加:

使用msysgit签出的文件正在使用CR+LF,我想强制msysgit将其与LF

一个简单的第一步仍将存在于.gitattributes文件中:

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(如在评论指出孙子,参照.gitattributes结束行变换),以避免任何CRLF与正确的文件的转换eol

而且我一直建议 git config --global core.autocrlf false禁用任何转换(这将适用于所有版本控制的文件)

请参阅跨平台git config的最佳做法?

从Git 2.16(Q1 2018)开始,您可以用来立即git add --renormalize .应用这些.gitattributes设置。


但是第二个更强大的步骤涉及gitattribute筛选器驱动程序,并添加一个涂抹步骤

筛选器驱动程序

每当您更新工作树时,脚本都只能(对于您在中指定的文件).gitattributes强制使用LF eol您要实施的和其他格式设置选项。
如果“ clear”脚本没有执行任何操作,则将在提交后对文件进行转换,并严格按照其需要使用的格式进行转换。


一个问题:* .txt是指所有扩展名为.txt的文件还是所有文本文件(非二进制)?我无法列出项目中将包含的所有文件扩展名。
索林2010年

1
@Sorin:所有带有.txt扩展名的文件。最好先建立一个并在特定组上对其进行测试,然后再推广为*,然后添加一个否定规则!*.xyz ...以从该规则中排除一些文件。
VonC

1
到目前为止,各.gitattributes行应显示为:*.txt text eol=lf按照git-scm.com/docs/gitattributes
孙子

@grandchild谢谢。我已将您的评论包含在答案中,以提高知名度。
VonC

我猜我们添加后.gitattributes必须做git add --renormalize .
舒瓦

460

在Windows中获取LF结尾的正确方法是首先设置core.autocrlffalse

git config --global core.autocrlf false

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

现在,git将不执行任何以规范化结尾的行。如果您希望您的文件签入到进行标准化,这样做:设置text=auto在您的.gitattributes所有文件:

* text=auto

并设置core.eollf

git config --global core.eol lf

现在,您还可以通过运行将单个存储库切换到crlf(在工作目录中!)。

git config core.eol crlf

完成配置后,您可能希望git规范化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 .

3
我收到致命的pathspec”之后没有匹配任何文件git diff --cached --name-only -z | xargs -0 git add
CMCDragonkai 2014年

3
输出是git diff --cached --name-only什么?
2014年

1
值得一提的是,您可以克隆有问题的存储库时设置此配置,例如git clone --config core.autocrlf=false <repo path>
克里斯·朗

240

尽管这些都不适合我,但我经常会回到这个答案。就是说,对我来说正确的答案是其他答案的混合体。

我发现有效的方法如下:

 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随后返回所有这些文件到他们自己的真实行结束(匹配什么在回购)的状态。

如果您需要在回购中修复文件的行尾,我建议抓住一个编辑器,该编辑器可以让您像IntelliJ或Sublime Text一样批量执行此操作,但是我敢肯定,任何优秀的编辑器都可能支持这一点。


1
我们只有一个带有子目录的仓库,需要不同的行尾处理。因此,为此设置全局选项不起作用。甚至在单个仓库中也没有。如何在.gitattributes中应用这些相同的设置?
RobG '16

Notepad++在右下角还显示了当前打开的文件的行尾。右键单击该字段将允许您更改行尾。
winklerrr

1
core.autocrlf input选项将覆盖core.eol设置,因此同时设置两者是多余的。(见git-scm.com/docs/git-config
安德鲁·马歇尔

1
谢谢您的帮助,我已经攻克了Lint和Linux。并且现在可以检入文件。
GC_

57

语境

如果你

  1. 想要强制所有用户对文本文件使用LF行结尾,并且
  2. 您不能确保所有用户都更改其git配置,

您可以从git 2.10开始。需要2.10或更高版本,因为2.10修复了text = auto和eol = lf的行为来源

将一个.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

3
这对我来说是最好的解决方案。我还将其与editorconfig.org结合使用,以便在编写Intellij时可以写出LF EOL。
Jazzepi

到目前为止,这是最好的解决方案。无需手动运行任何配置命令!
卡梅隆·塔克林德

26

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

随着core.autocrlf设置为input,git会不退房(所以如果你在回购有LF,你会得到LF)申请换行转换,但将确保万一你搞砸了,介绍的工作的一些CRLFs以某种方式复制,他们不会进入回购市场。


19
命令应该是git rm --cached -r。&& git reset --hard
koppor

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 true

祝你好运,我希望能有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.