【问题标题】:Working on Windows, but getting "LF will be replaced by CRLF" when committing in Git在 Windows 上工作,但在 Git 中提交时得到“LF 将被 CRLF 替换”
【发布时间】:2017-03-25 23:20:53
【问题描述】:

我正在从一个存储库中签出,我是 Mac 和 Linux 海洋中唯一的 Windows 用户。我的 IDE 在我的 Windows 机器上运行,并且代码被推送到 VM。代码未同步回主机。当我准备好在我的 Windows 主机上添加/提交时,我会收到 warning: LF will be replaced by CRLF 消息。

这些是我的 Git 设置:

core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
rebase.autosquash=true
credential.helper=manager
core.editor='C:/Program Files/Notepad++/notepad++.exe' -multiInst -nosession
core.filemode=false
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true

我不确定为什么core.filemode=false 被列出两次。

我在 Windows 上收到此警告是否有原因?我是否在我的设置中做一些愚蠢的事情(完全有可能)?或者,这在这种情况下是否有意义,如果是,为什么?

【问题讨论】:

标签: windows git


【解决方案1】:

Git 有两个地方可以控制换行:

  • 在系统的全局配置设置中
  • 在适用于每个 repo/项目的 .gitattributes 文件中。这些设置将覆盖用户的配置设置。

在您的 Git 设置中,您有 core.autocrlf=true。这意味着您要告诉 Git 将行尾更改为 CRLF。您可以更改它以查看 Git 是否停止尝试更改行尾。

git config --global core.autocrlf input

更好的方法可能是在 .gitattributes 文件中设置正确的行尾。这将提交到根目录中的存储库,它将覆盖用户的个人设置。这确保了所有提交到 repo 的用户都将具有正确的行尾。因为听起来您正在处理基于 *nix 的项目,所以将行尾设置为换行可能是谨慎的。在 .gitattribute 文件中你可以有这样的东西。

# Set all files to have LF line endings
* text eol=lf

此链接对您可以在文件中设置的选项有更详细的说明:https://help.github.com/articles/dealing-with-line-endings/

编辑 1:我想我是从实际的 Git 文档中添加的:https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration

core.autocrlf

如果您在 Windows 上编程并与人合作 谁不是(或反之亦然),您可能会遇到换行符 在某些时候出现问题。这是因为 Windows 同时使用了 回车符和换行符的换行符 文件,而 Mac 和 Linux 系统仅使用换行符。 这是跨平台工作的一个微妙但令人难以置信的事实; Windows 上的许多编辑器默默地替换现有的 LF 样式行 以 CRLF 结尾,或者在用户插入两个行尾字符时 按回车键。

Git 可以通过将 CRLF 行结尾自动转换为 LF 来处理这个问题 您将文件添加到索引中,反之亦然,当它签出代码时 到您的文件系统上。您可以使用 core.autocrlf 设置。如果您在 Windows 机器上,请将其设置为 true – 当您签出代码时,这会将 LF 结尾转换为 CRLF:

$ git config --global core.autocrlf true

如果您使用的是 Linux 或 Mac 使用 LF 行结尾的系统,那么你不希望 Git 签出文件时自动转换它们;然而,如果一个 不小心引入了带有 CRLF 结尾的文件,那么您可能想要 Git 来修复它。您可以告诉 Git 在提交时将 CRLF 转换为 LF,但是 而不是通过将 core.autocrlf 设置为 input:

$ git config --global core.autocrlf 输入

这个设置应该离开你 在 Windows 结帐中以 CRLF 结尾,但在 Mac 和 Linux 系统和存储库中。

如果您是一名 Windows 程序员,正在做一个仅限 Windows 的项目,那么您 可以关闭这个功能,记录回车在 通过将配置值设置为 false 来存储库:

$ git config --global core.autocrlf false

【讨论】:

  • 谢谢,您的回答加上@IngoB 的链接确实为我解决了这个问题。
【解决方案2】:

有一个常见的误解,即在 Windows 上,config.autocrlf=true 将始终让 Git 在检出文件时使用 CRLF 行结尾。但如果你仔细阅读Git documentation,你会注意到:

[设置config.autocrlf=true] 不会强制对文本文件进行规范化,但会确保您引入存储库的文本文件在添加时将其行尾规范化为 LF,并且已经在存储库保持规范化。

换句话说,如果文件在提交到存储库时已经被分类为文本文件,Git 只会在签出文件时使用 CRLF。默认情况下,Git 不会自动将文件分类为文本。是的,这非常烦人,但这是一种安全预防措施,因此默认情况下,Git 永远不会损坏它认为是文本的二进制文件。

我们可以通过告诉 Git 确定文件是否为文本来防止这个问题。以下任一选项均有效:

  1. 在 Git 属性文件中,set the "text" attribute to "auto" 用于所有文件。这会将 Git 配置为自动确定文件是否为文本。您可以为每个贡献者设置一次(默认位置:$HOME/.config/git/attributes),或为每个 repo 设置一次(.gitattributes)。

  2. 如果您在 Windows 机器上,set "core.autocrlf" to "true"。这与 #1 相同,但也将 core.eol 设置为 crlf,这就是为什么只应在 Windows 系统上执行此操作。

如果您有一个文件未被分类为文本的 repo,那么每当您提交对这些文件的更改时,您可能会收到一堆 LF will be replaced by CRLF 警告。为了一劳永逸地解决这个问题,在执行上述 Git 配置后,对所有文件运行 unix2dos(在 Git Bash 中使用 find . -exec unix2dos {} \;equivalent Windows command),然后提交它们。这些文件将立即重新分类为文本,您将不再收到警告,并且您还将受益于工作目录中的 CRLF 行结尾。远程存储库仍将使用 LF 行结尾,但具有上述配置的 Windows 系统上的 repo 的未来克隆将按预期在本地使用 CRLF 行结尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2022-11-10
    • 2011-09-23
    • 2021-08-07
    • 2019-04-16
    • 2014-09-05
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多