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

我想转换所有文件有LF换行,并保持在文件中的LF。

注意:我使用了自专制=输入,但这只是修复文件时,你提交他们。 我想强迫他们使用LF。

可能我说得不太清楚 存储库已经使用LF,但是签出的文件使用LF Git for Windows使用CR+LF 我想强迫Git用LF来获取它们: 强制Unix行结束符。

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

当前回答

在Windows中获得LF结尾的正确方法是首先设置核心。专制的虚假:

git config --global core.autocrlf false

如果使用msysgit,则需要这样做,因为它在系统设置中将其设置为true。

现在git不会做任何行结束归一化。如果你想让你签入的文件规范化,可以这样做:在你的.gitattributes中为所有文件设置text=auto:

* text=auto

并设定核心。Eol to lf:

git config --global core.eol lf

现在,您还可以通过运行将单个repo切换到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 .

其他回答

OP在他的问题中补充道:

使用msysgit签出的文件正在使用CR+LF,我想强制msysgit用LF获取它们

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

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(正如孙子注释中提到的,指的是.gitattributes行结束转换),以避免对具有正确eol的文件进行任何CRLF转换。

我一直推荐git配置——global core。禁止任何转换(这将应用于所有版本文件)

参见跨平台git配置的最佳实践?

从Git 2.16(2018年第一季度)开始,你可以使用Git add—renormalize。立即应用那些.gitattributes设置。


但是第二个更强大的步骤涉及到一个gitattribute过滤器驱动程序和添加一个smudge步骤

每当您要更新工作树时,脚本都可以强制LF eol和您想强制的任何其他格式化选项(仅针对您在.gitattributes中指定的文件)。 如果“clear”脚本什么都不做,那么(在提交之后)您将转换您的文件,应用您需要它们遵循的格式。

核心。专制lf=input是你想要的正确设置,但你可能不得不执行git update-index -refresh和/或git reset -更改很难生效。

与核心。自自LF设置为输入,git不会在签出时应用换行转换(所以如果你在repo中有LF,你会得到LF),但它会确保万一你搞混了,并以某种方式在工作副本中引入了一些crlf,它们不会进入repo。

上下文

如果你

我想强制所有用户在文本文件中使用LF行结束符 你不能保证所有用户都改变他们的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

在Windows中获得LF结尾的正确方法是首先设置核心。专制的虚假:

git config --global core.autocrlf false

如果使用msysgit,则需要这样做,因为它在系统设置中将其设置为true。

现在git不会做任何行结束归一化。如果你想让你签入的文件规范化,可以这样做:在你的.gitattributes中为所有文件设置text=auto:

* text=auto

并设定核心。Eol to lf:

git config --global core.eol lf

现在,您还可以通过运行将单个repo切换到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 .

我经常回到这个问题上,尽管其他答案都不太适合我。 也就是说,对我来说,正确的答案是其他答案的混合。

我发现以下方法是有效的:

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

对于在这些全局设置设置之后检出的回购(Git存储库),所有内容都将检出为回购中的任何内容—希望是LF (\n)。 任何CRLF都将在签入(提交)时转换为LF。

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

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

这将递归地(-r)删除(rm),不提示(-f),所有文件,除了那些你已经编辑(——cached),从当前目录(.)。然后重置将所有这些文件返回到它们具有真实行结束符的状态(与repo中的内容匹配)。

如果你需要在repo中修复文件的行结束符,我建议你使用IntelliJ或Sublime Text这样的编辑器,但我相信任何好的编辑器都可能支持这一点。