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 false
和 git 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?的主要内容,如果未能解决你的问题,请参考以下文章