472

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

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

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

可能我不是很清楚:存储库已经在使用LF,但是使用 msysgit 签出的文件正在使用CR+LF,我想强制 msysgit 使用LF: forcing Unix line endings来获取它们。

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

6 回答 6

582

在 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

现在,您还可以通过运行将单个 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 .
于 2012-10-31T08:38:57.837 回答
329

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

我发现的作品如下:

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

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

使用您已经签出的现有存储库(在存储库中具有正确的行结尾但不是您的工作副本),您可以运行以下命令来修复它:

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

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

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

于 2015-10-29T21:24:19.697 回答
168

OP在他的问题中补充说:

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

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

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(如孙子的评论中所述,指的是行尾转换),以避免对正确的文件进行任何转换。.gitattributesCRLFeol

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

请参阅跨平台 git config 的最佳实践?

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


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

过滤器驱动程序

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

于 2010-03-25T16:37:09.520 回答
97

语境

如果你

  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
于 2017-02-09T11:52:13.677 回答
27

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

core.autocrlf设置为 时,git 不会在input结帐时应用换行符转换(所以如果你在 repo 中有 LF,你会得到 LF),但它会确保万一你搞砸并在工作中引入一些 CRLF以某种方式复制,他们不会进入回购。

于 2010-04-01T00:23:15.573 回答
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

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

于 2020-03-26T20:54:05.943 回答