180

环境:

  • Windows 7的
  • msysgit

当我git commit,它说:

warning: LF will be replaced by CRLF. 

这个警告尾巴是向后的吗?
我在 Windows 中编辑文件,行尾是CRLF,就像这张图片:
在此处输入图像描述
并且 git 将其更改为LF以提交 repo。
所以我认为正确的警告是:

warning: CRLF will be replaced by LF. 
4

12 回答 12

217

警告:LF 将被 CRLF 取代。

根据您使用的编辑器,带有 LF 的文本文件不必使用 CRLF 保存:最近的编辑器可以保留eol 样式。但是那个 git config 设置坚持要改变那些......

只需确保(正如我在这里推荐的那样):

git config --global core.autocrlf false

这样,您可以避免任何自动转换,并且仍然可以通过.gitattributes文件core.eol指令指定它们。


windows git“LF将被CRLF取代”
这个警告尾巴向后吗?

否:您使用的是 Windows,并且git config帮助页面确实提到了

CRLF如果即使存储库没有规范化的行尾,您也希望在工作目录中有行尾,请使用此设置。

如“ git 用 CRLF 替换 LF ”中所述,它应该只发生在结帐(而不是提交)时,使用core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

正如 小鹏回答中提到的,该警告与以下内容相同:

警告:(如果您将其签出/或使用当前core.autocrlf配置克隆到另一个文件夹,)LF 将被替换为 CRLF
该文件将在您的(当前)工作目录中具有其原始行结尾。

git-for-windows/git问题 1242中所述:

file.json我仍然觉得此消息令人困惑,可以扩展该消息以包含对该问题的更好解释,例如:“删除文件并再次检出后,LF 将被 CRLF 替换”。

注意:Git 2.19(2018 年 9 月),当使用 时core.autocrlf虚假的“LF 将被 CRLF 替换”警告现在被抑制


正如quaylar正确评论的那样,如果提交时有转换,则LF只有。

该特定警告“ LF will be replaced by CRLF”来自convert.c#check_safe_crlf()

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

它被 调用convert.c#crlf_to_git(),自身被 调用convert.c#convert_to_git(),自身被 调用convert.c#renormalize_buffer()

最后一个renormalize_buffer()仅由 调用merge-recursive.c#blob_unchanged()

所以我怀疑这种转换git commit只有在所述提交是合并过程的一部分时才会发生。


注意:使用 Git 2.17(2018 年第二季度),代码清理增加了一些解释。

请参阅Torsten Bögershausen ( ) 的commit 8462ff4(2018 年 1 月 13 日(由Junio C Hamano 合并——提交 9bc89b1中,2018 年 2 月 13 日)tboegi
gitster

convert_to_git(): safe_crlf/checksafe 变成 int conv_flags

调用 时convert_to_git(),该checksafe参数定义了如果 EOL 转换 ( CRLF --> LF --> CRLF) 不干净地往返应该发生什么。
此外,它还定义了行尾是否应该重新规范化 ( CRLF --> LF) 或保持原样。

checksafe 是safe_crlf具有以下值的枚举:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

请 注意,尽管设置. _ _ convert_to_git()safe_crlf/checksafeint conv_flagsautocrlfsafecrlf=false

请参阅Anthony Sottile ( ) 的提交 6cb0912(2018 年 6 月 4 日(由Junio C Hamano 合并 -- --8063ff9 提交中,2018 年 6 月 28 日)asottile
gitster

于 2013-07-13T08:18:42.673 回答
35

的,警告是向后的。

事实上,它甚至不应该是一个警告。因为所有这些警告都在说(但不幸的是倒退)是文件中带有 Windows 行结尾的 CRLF 字符将在提交时被替换为 LF。这意味着它被标准化为 *nix 和 MacOS 使用的相同行尾。

没有什么奇怪的事情发生,这正是您通常想要的行为。

当前形式的此警告是以下两种情况之一:

  1. 不幸的错误与过于谨慎的警告信息相结合,或
  2. 一个非常聪明的情节,让你真正想通了……

;)

于 2016-06-30T00:07:12.650 回答
26

--7月9日更新--

删除了@mgiuca 评论的“它是正确和准确的”

======

没有。它不是在谈论您当前使用的文件CRLF。相反,它使用LF.

它应该是:

警告:(如果您使用当前的 core.autocrlf 配置将其签出/或克隆到另一个文件夹,)LF 将被 CRLF 替换

该文件将在您的(当前)工作目录中具有其原始行结尾。

这张图片应该解释它的含义。 在此处输入图像描述

于 2017-06-16T06:09:04.463 回答
13

所有这一切都假设core.autocrlf=true

原始错误:

警告:LF 将被替换为 CRLF
该文件将在您的工作目录中具有其原始行结尾。

错误应该读什么:

警告:LF 将在您的工作目录中替换为 CRLF 该文件将在 git 存储库中
具有其原始 LF 行结尾

这里的解释:

这种方便转换的副作用,这就是您所看到的警告,如果您最初创作的文本文件以 LF 结尾而不是 CRLF 结尾,它将像往常一样与 LF 一起存储,但是当检查时稍后会出现 CRLF 结尾。对于普通的文本文件,这通常很好。在这种情况下,警告是“供您参考”,但如果 git 错误地将二进制文件评估为文本文件,这是一个重要的警告,因为 git 会破坏您的二进制文件。

基本上,以前是 LF 的本地文件现在将在本地具有 CRLF

于 2016-11-24T15:37:56.177 回答
8

git config --global core.autocrlf false适用于全局设置。

但如果您使用的是 Visual Studio,可能还需要.gitattributes针对某些类型的项目进行修改(例如 c# 类库应用程序):

  • 删除线* text=auto
于 2018-06-13T03:32:37.237 回答
4

发生这种情况是因为 Windows 上的 GitHub Desktop 的配置假定为 CRLF,但文本编辑器可能正在使用 LF。您可以更改本地存储库设置以改为使用lf

导航到 git repo 的根目录并以完全相同的顺序执行

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

来源:GitHub问题

于 2021-07-16T04:06:23.680 回答
2

在我设置之后,当我正在(或者可能是它在?)在存储库的 Windows 中编辑文件core.autocrlf=true时,我得到“LF 将被 CRLF 替换”(注意不是“CRLF 将被 LF 替换”)LF)我设置.git addgit commitcore.autocrlf=true

我做了一个新的结帐,core.autocrlf=true现在我没有收到这些消息。

于 2015-06-03T15:18:02.040 回答
0

关闭 Visual Studio

如果您收到错误,一个简单的修复方法是关闭 Visual Studio,然后您可以提交到 main,就这么简单。我有同样的问题,这就是我解决它的方法。这是因为您要打开的文件在另一个程序中打开。

于 2021-12-01T03:46:39.620 回答
0

确保在文件中添加了不必要的文件或文件夹.gitignore

例如 node_modules

如果仍然面对然后运行此命令

``git config --global core.autocrlf false```

于 2021-07-08T11:31:24.473 回答
0

我遇到了类似的问题并在 Windows 上使用 vscode(v1.57) 尝试了其他答案中定义的解决方案,但没有奏效。

所以对我来说,以下步骤有效:

  1. 在根文件夹中有一个名为 .editorconfig 的文件
  2. 打开此文件并更改end_of_line = lfend_of_line = crlf
  3. 运行git rm --cached和警告消失了!!
于 2021-06-18T19:16:35.230 回答
-1

做简单的事:

  1. 打开 git-hub (Shell) 并导航到文件所属的目录 (cd /a/b/c/...)
  2. 执行 dos2unix(有时是 dos2unix.exe)
  3. 现在尝试提交。如果你再次遇到同样的错误。执行所有上述步骤,而不是 dos2unix,执行 unix2dox(有时是 unix2dos.exe)
于 2016-05-26T09:51:36.560 回答
-2

如果您使用的是 Visual Studio 2017、2019,您可以:

  1. 打开主 .gitignore (更新或删除解决方案中其他项目中的其他 .gitignore 文件)
  2. 粘贴以下代码:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process
于 2020-03-28T19:27:17.680 回答