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

Posted

技术标签:

【中文标题】windows下如何强制git使用LF而不是CR+LF?【英文标题】:How do I force git to use LF instead of CR+LF under windows? 【发布时间】:2011-01-31 19:27:57 【问题描述】:

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

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

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

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

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

【问题讨论】:

autocrlf=input 是正确的选项。当然,它不会保护您免受存储库中真正具有 cr+lf 的文件的影响,或者在将它们添加到 git 之前在另一个工具中使用 cr+lf 创建文件。您遇到了哪些问题无法解决? 存储库中的文件已经只使用了LF,但是当我在 Windows 下获取它们时,msysgit 会将它们转换为CR+LF 你的配置一定有问题;我刚刚在我的 msysgit 安装上对此进行了测试。将autocrlf 设置为input,git 将单独留下lf 换行符。你能发布git config的输出吗? 在这种情况下,我建议你记录一个错误;最好指向一个测试存储库,该存储库会显示您的问题并包括重现的步骤,因为您看到的行为肯定是错误的(但我无法重现它)。 一个小技巧是还要确保您在您认为的“git”上运行 git 命令。例如你可能在 windows 上安装了 git,在 cygwin 上安装了 git,所以请确保你设置了正确的 git config。 【参考方案1】:

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

git config --global core.autocrlf false

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

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

* 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 .

【讨论】:

我得到了致命的 pathspec '' 没有匹配任何文件,就在 git diff --cached --name-only -z | xargs -0 git add 之后 git diff --cached --name-only 的输出是什么? 值得一提的是,您可以设置此配置同时克隆有问题的存储库,例如git clone --config core.autocrlf=false <repo path>. 我得到了这个答案,因为每次我在文件上单击 git "Rollback..." 时,我的 WebStorm/phpStorm 都会将行尾从 LF 转换为 CRLF。在此操作之后,所有文件都是红色的,因为 ESLint 由于不正确的结尾而在每一行下划线。几个命令解决了我的问题:git config --global core.autocrlf falsegit config --global core.eol lf。谢谢! 你先生,真是个天才【参考方案2】:

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

我发现的作品如下:

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

对于在设置这些全局设置后签出的存储库,所有内容都将按照存储库中的内容进行签出 - 希望是 LF (\n)。任何CRLF 都将在签入时仅转换为LF

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

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

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

如果您需要修复 repo 中文件的行尾,我建议您使用一个可以让您批量执行此操作的编辑器,例如 IntelliJ 或 Sublime Text,但我相信任何好的编辑器都可能支持这一点。

【讨论】:

我们有一个带有子目录的单一仓库,这些子目录需要不同的行尾处理。所以设置一个全局选项对此不起作用。甚至在单个回购中也没有。您如何在 .gitattributes 中应用这些相同的设置? Notepad++ 还在右下角显示当前打开文件的行尾。右键单击该字段将允许您更改行尾。 core.autocrlf input 选项会覆盖core.eol 设置,因此设置两者都是多余的。 (见git-scm.com/docs/git-config) 谢谢你,在你的帮助下,我征服了 lint 和 Linux。现在可以签入文件了。 我认为作者设置core.eol是因为在某些情况下某些编辑器或其他应用程序可能会覆盖core.autocrlf的值,所以这个设置用作备份。【参考方案3】:

OP 在他的问题中添加:

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

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

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(as noted in the comments by grandchild,指的是.gitattributes End-of-line conversion),以避免对具有正确eol 的文件进行任何CRLF 转换。

和I have always recommended git config --global core.autocrlf false 禁用任何转换(这将适用于所有版本文件)

Best practices for cross platform git config?

Since Git 2.16(2018 年第一季度),您可以使用 git add --renormalize . 立即应用这些 .gitattributes 设置。


但第二个更强大的步骤涉及gitattribute filter driver 并添加一个涂抹步骤

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

【讨论】:

一个问题:*.txt 是指所有带有 .txt 扩展名的文件还是所有文本文件(非二进制)?我无法列出项目中的各种文件扩展名。 @Sorin:所有带有.txt 扩展名的文件。最好先建立它并在特定组上对其进行测试,然后再推广到 *,并添加否定规则 !*.xyz ... 以从该规则中排除一些文件。 现在.gitattributes 行应该是:*.txt text eol=lf 按照git-scm.com/docs/gitattributes @grandchild 谢谢。我已将您的评论包含在答案中以提高知名度。 我想在我们添加.gitattributes之后我们必须做git add --renormalize .【参考方案4】:

上下文

如果你

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

您可以从 git 2.10 开始执行此操作。需要 2.10 或更高版本,因为2.10 fixed the behavior of text=auto together with eol=lf。 Source.

解决方案

.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

【讨论】:

这对我来说是最好的解决方案。我还将它与editorconfig.org 结合起来,以便在用 Intellij 编写时我会写出 LF EOL。 这是迄今为止最好的解决方案。无需手动运行任何配置命令! 这一行 .gitattributes 条目是最好的,其他解决方案可能会令人困惑。【参考方案5】:

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

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

【讨论】:

命令应该是 git rm --cached -r 。 && git reset --hard【参考方案6】:

您可以在以下位置找到此问题的解决方案: 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

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

【讨论】:

以上是关于windows下如何强制git使用LF而不是CR+LF?的主要内容,如果未能解决你的问题,请参考以下文章

CR, LF, CR/LF 回车 换行

CR, LF, CR/LF 回车 换行

CR LF、LF 和 CR 换行符类型的区别?

vim 中 <CR> 啥意思?

git转换换行符LF与CRLF转换问题-Windows系统和Linux系统差异统一

git转换换行符LF与CRLF转换问题-Windows系统和Linux系统差异统一