ChatGPT解决这个技术问题 Extra ChatGPT

Git 用 CRLF 替换 LF

在 Windows 机器上,我使用 git add 添加了一些文件。我收到警告说:

LF 将被 CRLF 取代

这种转换的后果是什么?

@apphacker 因为标准化行尾比在比较两个文件时必须自己更改它们更不烦人。 (当然,如果您不同意,那么您可以关闭 core.autocrlf 功能)。
除非整行都被触及,否则为什么行尾会有所不同
我经常接触很多行,因为我正在尝试不同的想法,添加跟踪语句以查看它们是如何工作的,等等。然后我可能只想对两三行进行更改并让 git 完全忽略其他行,因为我已经按照我找到它们的方式放回了它们(或者我是这么认为的)。
@MatrixFrog:您的编辑器似乎坏了,无法自动检测行尾。它是哪一个?我从事的混合项目必须在同一个 repo 中有一些 LF 文件和一些其他 CRLF 文件。对于任何现代编辑器来说都不是问题。让版本控制(或文件传输)与行尾混淆以解决编辑器限制是有史以来最糟糕的想法 - 从下面的解释中显而易见。
我所知道的唯一一个做错事的现代编辑器是 Visual Studio。 Visual Studio 将愉快地打开一个以 LF 行结尾的文件。如果然后插入新行,它将插入 CRLF,并保存混合行结尾。微软拒绝解决这个问题,这对于一个非常好的 IDE 来说是一个很大的缺陷:--(

3
35 revs, 10 users 61%

这些消息是由于 Windows 上的 core.autocrlf 的默认值不正确。

autocrlf 的概念是透明地处理行尾转换。确实如此!

坏消息:该值需要手动配置。

好消息:每个 Git 安装只能执行一次(也可以按项目设置)。

autocrlf 的工作原理

core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:

     repository               repository               repository
      ^      V                 ^      V                 ^      V
     /        \               /        \               /        \
crlf->lf    lf->crlf     crlf->lf       \             /          \
   /            \           /            \           /            \

这里 crlf = win 样式的行尾标记,lf = unix 样式(自 Mac OS X 起也用于 Mac)。

(以上三个选项中的任何一个都不影响 pre-osx cr。)

此警告何时出现(在 Windows 下)?

    – autocrlf = true 如果您的一个文件中有 unix 风格的 lf(= 很少),
    – autocrlf = input 如果您的一个文件中有 win 风格 crlf(= 几乎总是),
    – autocrlf = false – 绝不!

这个警告是什么意思?

警告“LF 将被 CRLF 替换”表示您(具有 autocrlf=true)将在提交签出周期后丢失您的 unix 样式的 LF(它将被 windows-样式 CRLF)。 Git 不希望你在 Windows 下使用 unix 风格的 LF。

警告“CRLF 将被 LF 替换”表示您(具有 autocrlf=input)将在提交签出周期后丢失 Windows 样式的 CRLF(它将被 unix 替换风格的LF)。不要在 Windows 下使用 input

展示 autocrlf 工作原理的另一种方式

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

其中 x 是 CRLF(windows 风格)或 LF(unix 风格),箭头代表

file to commit -> repository -> checked out file

怎么修

core.autocrlf 的默认值在 Git 安装期间选择并存储在系统范围的 gitconfig 中(Windows 上为 %ProgramFiles(x86)%\git\etc\gitconfig,Linux 上为 /etc/gitconfig)。还有(按以下顺序级联):

   – 位于 ~/.gitconfig 的“全局”(每个用户)gitconfig,还有另一个
   – $XDG_CONFIG_HOME/git/config$HOME/.config/git/config
   的“全局”(每个用户)gitconfig – 工作目录中 .git/config 处的“本地”(每个 repo)gitconfig。

因此,在工作目录中写入 git config core.autocrlf 以检查当前使用的值和

   – git config --system core.autocrlf false            # 按系统解决方案
   – git config --global core.autocrlf false            # 每用户解决方案
   – git config --local core.autocrlf false              # 每个项目的解决方案

警告

    – git config 设置可以被 gitattributes 设置覆盖。
    – crlf -> lf 转换仅在添加新文件时发生,crlf 文件已经回购中存在的不受影响。

道德(对于 Windows):

    - 如果您也打算在 Unix 下使用这个项目(并且不愿意将您的编辑器/IDE 配置为使用 unix 行尾),请使用 core.autocrlf = true
   ;  - 如果您打算仅在 Windows 下使用此项目(或者您已将编辑器/IDE 配置为使用 unix 行尾),请使用 core.autocrlf = false
     ;- 从不使用 core.autocrlf = input 除非你有充分的理由(例如如果你在 Windows 下使用 unix 实用程序或者遇到 makefile 问题),

PS 安装 Git for Windows 时要选择什么?

如果您不打算在 Unix 下使用任何项目,请不要同意默认的第一个选项。选择第三个(按原样结帐,按原样提交)。您不会看到此消息。曾经。

PPS:我个人的偏好是将 editor/IDE 配置为使用 unix 风格的结尾,并将 core.autocrlf 设置为 false


这太令人困惑了。我在我的编辑器中设置了 LF。所有的 repo 代码都使用 LF。全局 autocrlf 设置为 false,我的主目录中的核心 gitconfig 设置为 false。但是我仍然收到消息 LF 被替换为 CRLF
如果您已将编辑器配置为使用 Unix 样式结尾,为什么不将 core.autocrlf 设置为输入?根据我从您的回答中收集到的信息,将其设置为 input 可确保存储库和工作目录始终具有 unix 样式的行结尾。为什么您从不希望在 Windows 中使用它?
不过有些奇怪。我在全局和本地配置中都将 core.autocrlf 设置为 false,但是在尝试提交时我仍然收到警告。 git 版本是 2.7.0
想通了: .gitattributes 可以覆盖配置设置。
@AntonyHatchkins 好处是 input 将转换我的行尾,如果我 不小心 在某个地方有一个 CRLF(也许你曾经在记事本中快速编辑而不是你配置良好的 IDE!),而不影响所有有意的 LF。使用 false 的缺点是,如果我有一个意外的 CRLF,我可能会不小心将它提交给 repo。 input 会阻止这种情况!所以 input > false,不是吗?
P
Peter Mortensen

Git 有三种处理行尾的模式:

# This command will print "true" or "false" or "input"
git config core.autocrlf

您可以通过在上述命令行中添加附加参数 truefalse 来设置要使用的模式。

如果 core.autocrlf 设置为 true,这意味着每当您将文件添加到 Git 存储库中 Git 认为是文本文件时,它会将所有 CRLF 行结尾仅转换为 LF,然后再将其存储到提交中。每当您 git checkout 某些东西时,所有文本文件都会自动将其 LF 行结尾转换为 CRLF 结尾。这允许跨使用不同行尾样式的平台开发项目,而不会产生非常嘈杂的提交,因为每个编辑器都会更改行尾样式,因为行尾样式始终是 LF。

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

如果 core.autocrlf 设置为 false,则不会执行任何行尾转换,因此文本文件按原样签入。这通常可以正常工作,只要您的所有开发人员都在 Linux 上或全部在 Windows 上。但根据我的经验,我仍然倾向于得到带有混合行尾的文本文件,最终导致问题。

作为 Windows 开发人员,我个人的偏好是将设置保持打开状态。

请参阅 git-config 了解包含“输入”值的更新信息。


如此处所述(stackoverflow.com/questions/1249932/…),我会恭敬地不同意并将该设置保留为 OFF(并使用 Notepad++ 或任何其他能够处理的编辑器 - 并保持原样 - 它找到的任何结束行字符)
我喜欢这个答案,并且更喜欢将 autocrlf 设置为 true。作为替代方案,有没有办法自动终止警告消息?
最好通过与 core.eol 设置的比较来扩充这个写得很好的答案,也许与 .gitattributes 配置相一致。我一直试图通过实验找出差异和重叠,这非常令人困惑。
要获得更永久的解决方案,请将 .gitconfig 更改为: [core] autocrlf = false
有什么简单的方法可以消除警告吗?我希望它为真,并且知道我已将其设置为真。我不需要一直看到所有的警告......没关系,真的......:p
P
Peter Mortensen

如果您已签出代码,则文件已编入索引。更改 Git 设置后,例如运行:

git config --global core.autocrlf input

您应该刷新索引

git rm --cached -r .

并用重写 Git 索引

git reset --hard

注意:这将删除您的本地更改。考虑在执行此操作之前将它们存放起来。

来源:Configuring Git to Handle Line Endings


感谢您提供一种简单、跨平台、清晰的方式来修复它,而不是对配置含义进行大量讨论。
如果 git reset --hard 我的本地更改可能会丢失吗?我只是按照上面的所有评论
是的,您的本地更改将丢失。 --hard 参数重置索引和工作树,因此对跟踪文件的任何更改都将被丢弃。 git-scm.com/docs/git-reset
git rm --cached -r . 是什么意思?为什么 git reset --hard 还不够?
@gavenkoa @max 您需要 git rm --cached -r . 如果您在更改 core.autocrlf 设置后执行 git reset --hard,它将不会重新转换行尾。您需要清理 git 索引。
S
Sahil Mittal
git config core.autocrlf false

确保在存储库根目录中运行它
我不明白这有什么用。一半的人需要 autocrlf 为真才能工作,另一半需要它为假/输入。那么,他们是否应该将这些一次性答案随机扔到他们的控制台墙上,直到某些东西粘住并有点“起作用”?这是没有生产力的。
我收到一个错误“致命:不在 git 目录中”。我试图 cd 到 C:\Program Files\Git 和 C:\Program Files\Git\bin
@mbb 将 autcrlf 设置为 false 只是将问题推给项目的每个用户。
@pixelwiz :此命令仅为项目设置属性(因此您需要在 git 存储库下才能运行它)。如果要全局设置,请改用 git config --global core.autocrlf false
P
Peter Mortensen

unix2dosdos2unix 在带有 Git Bash 的 Windows 上可用。您可以使用以下命令执行 UNIX (LF) → DOS (CRLF) 转换。因此,您不会收到警告。

unix2dos filename

或者

dos2unix -D filename

但是,不要在任何现有的 CRLF 文件上运行此命令,因为这样您将每隔两行得到空换行符。

dos2unix -D filename 不适用于所有操作系统。请检查 this link 的兼容性。

如果由于某种原因您需要强制执行该命令,请使用 --force。如果显示无效,则使用 -f


以下是帮助选项的内容:`--u2d, -D 执行 UNIX -> DOS 转换`
@LarryBattle u2d 和 d2u 我相信不是一回事。
@Rifat 我很困惑。您的评论说 dos2unix -D 会将 windows 行尾转换为 linux 行尾。这和 DOS(CRLF) 不一样吗? UNIX(LF) 转换。但是 dos2unix -h 声明 -D 将执行 UNIX(LF) -> DOS(CRLF)转换。 dos2unix 更多信息:gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix
@LarryBattle 是的,关于-D,你是对的。实际上,当我是 Windows 用户时,我发布了答案。而且,一年多后,当我是 Mac 用户时,我发表了评论:D BTW,感谢您的澄清。
这对我有用。我正在使用 Cygwin,它似乎不支持 -D 开关 - 但是有一个“unix2dos”命令,它做同样的事情。我希望我知道是什么导致了这个问题——我有 core.autocrlf = false 并且它是一个仅限 Windows 的存储库。
P
Peter Mortensen

在谈论这个话题时通常会提到 GitHub article on line endings

我个人对使用经常推荐的 core.autocrlf 配置设置的体验非常复杂。

我正在使用带有 Cygwin 的 Windows,在不同时间处理 Windows 和 Unix 项目。甚至我的 Windows 项目有时也会使用需要 Unix (LF) 行结尾的 Bash shell 脚本。

使用 GitHub 为 Windows 推荐的 core.autocrlf 设置,如果我签出一个 Unix 项目(它在 Cygwin 上完美运行 - 或者我正在为我在我的 Linux 服务器上使用的项目做出贡献),文本文件将被签出Windows (CRLF) 行尾,产生问题。

基本上,对于像我这样的混合环境,将全局 core.autocrlf 设置为任何选项在某些情况下都无法正常工作。此选项可能在本地(存储库)Git 配置中设置,但即使这样对于包含 Windows 和 Unix 相关内容的项目也不够好(例如,我有一个带有一些 Bash 实用程序脚本的 Windows 项目) .

我发现的最佳选择是创建每个存储库的 .gitattributes 文件。 GitHub article 提到了它。

那篇文章的例子:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

在我的项目的一个存储库中:

* text=auto

*.txt         text eol=lf
*.xml         text eol=lf
*.json        text eol=lf
*.properties  text eol=lf
*.conf        text eol=lf

*.awk  text eol=lf
*.sed  text eol=lf
*.sh   text eol=lf

*.png  binary
*.jpg  binary

*.p12  binary

设置的东西要多一些,但每个项目只做一次,任何操作系统上的任何贡献者在处理这个项目时都应该不会遇到行尾问题。


现在遇到这个问题,尝试使用 Cygwin 脚本在其他基本文本文件中管理 repo。您将如何处理没有扩展名的文件(例如“fstab”、“sshd_config”)?链接的文章没有涵盖这种情况。
@MikeLoux 试试这个方法:stackoverflow.com/a/44806034/4377192
我发现 text=false eol=false 的工作方式与 binary 有点相似。听起来对吗?指示“我知道这些是文本文件,但我不希望它们被规范化”可能很有用
P
Peter Mortensen

我认为 Basiloungas's answer 很接近,但已过时(至少在 Mac 上)。

打开 ~/.gitconfig 文件并将 safecrlf 设置为 false:

[core]
       autocrlf = input
       safecrlf = false

这 * 将使它显然忽略行尾字符(无论如何它对我有用)。


它应该是 safecrlf(带有“f”)
P
Peter Mortensen

在 Vim 中,打开文件(例如::e YOURFILEENTER),然后

:set noendofline binary
:wq

简单地用 vim 编辑将使所有行结尾保持不变。
我一直在使用一些 Cocoapods 文件时遇到这个问题。以上修复了大部分;其余的,s/{control-v}{control-m}// 成功了。这两个控制代码一起构成了我们这些 OS X 上的人经常在 Windows 文件中看到的 ^M。
T
Tim Abell

我也有这个问题。

SVN 不进行任何行尾转换,因此文件以完整的 CRLF 行尾提交。如果您随后使用 git-svn 将项目放入 git 中,那么 CRLF 结尾会一直存在到 git 存储库中,这不是 git 期望找到的状态 - 默认情况下只有 unix/linux (LF) 行结尾入住。

然后,当您在 Windows 上签出文件时,autocrlf 转换会使文件保持原样(因为它们已经具有当前平台的正确结尾),但是决定与签入文件是否存在差异的过程会执行反向转换在比较之前,将它认为是签出文件中的 LF 与存储库中的意外 CRLF 进行比较。

据我所知,您的选择是:

在不使用 git-svn 的情况下将代码重新导入新的 git 存储库,这将意味着在初始 git commit 中转换行尾 --all 将 autocrlf 设置为 false,并忽略行尾不是 git 首选样式的事实在 autocrlf 关闭的情况下检查您的文件,修复所有行结尾,重新检查所有内容,然后再次打开它。重写存储库的历史记录,以便原始提交不再包含 git 不期望的 CRLF。 (关于历史重写的常见警告适用)

脚注:如果您选择选项 #2,那么我的经验是某些辅助工具(rebase、patch 等)无法处理 CRLF 文件,您迟早会遇到混合了 CRLF 和 LF 的文件(不一致的行结局)。我知道没有办法两全其美。


我认为有第四个选项可以添加到您的列表中,假设您可以负担重写历史:您可以使用最初使用 git-svn 创建的 git 存储库,并重写其历史以不再具有 CRLF 换行符。这将为您提供在整个 svn 历史中向后延伸的标准化换行符。用户 keo 在 stackoverflow.com/a/1060828/64257 提出了一种解决方案。
关于您的脚注:rebase 对 CRLF 没有问题。我知道的唯一问题是标准 git 合并工具将插入其冲突标记(“<<<<<<”、“>>>>>>”等。 ) 仅使用 LF,因此具有冲突标记的文件将具有混合行结尾。但是,一旦您删除标记,一切都很好。
git 的处理方式可能在过去 3 年发生了变化,这是我当时的直接经验,从那以后我不需要重新审视这个特定问题。 ymmv。
@sleske 从 git 2.8 开始,合并标记将不再引入混合行结尾。请参阅stackoverflow.com/a/35474954/6309
@VonC:这很酷。很高兴知道我需要在 Windows 上工作的时间。
P
Peter Mortensen

从 ~/.gitattributes 文件中删除以下内容,

* text=auto

将阻止 Git 首先检查行尾。


不正确。该行(如果存在)将覆盖 core.autocrlf 的配置。如果将其设置为“true”,则不,删除该行不会阻止 git 检查行尾。
尽管如此,如果将 core.autocrlf 设置为 false,如果不删除这个,将 autocrlf 设置为 false 将无济于事,所以这个对我有帮助(但它本身还不够)。
赞这个!!虽然“将阻止 git 检查”部分在技术上并不正确,但这是唯一一个专门提到 .gitattributes 中的 text= 设置的答案(如果存在,它将成为一个阻止程序)。所以其他答案不完整。我疯了想弄清楚为什么我的文件继续显示为“已修改”,无论我更改了多少次我的 autocrlfsafecrlf 设置和签出&清除了 git 缓存 &硬重置。
P
Peter Mortensen

Windows 中的大多数工具也接受文本文件中的简单 LF。例如,您可以使用以下示例内容(部分)在名为“.editorconfig”的文件中控制 Visual Studio 的行为:

 indent_style = space
 indent_size = 2
 end_of_line = lf    <<====
 charset = utf-8

只有最初的 Windows Notepad 不能与 LF 一起使用,但有一些更合适的简单编辑器工具可用!

因此,您也应该在 Windows 的文本文件中使用 LF。这是我的信息,强烈推荐!没有任何理由在 Windows 中使用 CRLF!

(同样的讨论是在 C/++ 中的包含路径中使用 \。它是牛粪。使用带有斜线的 #include <pathTo/myheader.h>!,它是 C/++ 标准和所有 Microsoft编译器支持它)。

因此,Git 的正确设置是:

git config core.autocrlf false

我的信息:忘记像 dos2unixunix2dos 这样的旧思维程序。在您的团队中澄清 LF 适合在 Windows 下使用。


P
Peter Mortensen

How to make Git ignore different line endings

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/(不工作)

您可以完全禁用 CRLF 行为,或者通过更改 .gitattributes 文件中的条目来禁用每个文件类型。在我的例子中,我这样写: -crlf 这告诉 Git 忽略所有文件的行尾。并且不会更改工作目录中的文件。即使您将 core.autocrlf 设置为 true、false 或 input。

echo "* -crlf" > .gitattributes

在单独的提交上执行此操作,否则 Git 可能仍会在您进行单个更改时看到整个文件已修改(取决于您是否更改了 autocrlf 选项)。

这个真的很管用。 Git 将尊重混合行结尾项目中的行结尾,并且不会警告您。


当您想要在 CRLF 和 LF 之间进行转换时,这尤其有用,但是您有一些必须保持不变的 .sh 文件。我一直使用 *.sh -crlf...
最佳解决方案。结合 git rm --cached -r .git reset --hard 它适用于项目中的每个人。
第二个链接坏了:“500 Internal Server Error”
嗨@PeterMortensen,关于您的编辑,因为 git 是在区分大小写的环境中起源的命令行程序,将其称为“git”而不是“Git”是否有意义?
P
Peter Mortensen

我对 Windows 上的 Git 不太了解,但是...

在我看来,Git 正在转换返回格式以匹配运行平台(Windows)的格式。 CRLF 是 Windows 上的默认返回格式,而 LF 是大多数其他操作系统的默认返回格式。

很有可能,当代码移动到另一个系统时,返回格式将被正确调整。我还认为 Git 足够聪明,可以保持二进制文件完整,而不是尝试将 LF 转换为 CRLF,例如 JPEG 文件。

总之,您可能不需要对这种转换过于担心。但是,如果您将项目归档为 tarball,其他编码人员可能会喜欢使用 LF 行终止符而不是 CRLF。根据您的关心程度(并且取决于您不使用 Notepad),如果可以的话,您可能希望将 Git 设置为使用 LF 返回 :)

附:CR是ASCII码13,LF是ASCII码10。因此,CRLF是两个字节,而LF是一个字节。


由于似乎没有人说过,CR 代表“回车”,LF 代表“换行”。作为第二个注意事项,许多 Windows 编辑器会默默地将带有表示换行符的 LF 字符的文本文件更改为字符对 CRLF。编辑器的用户甚至不会被警告,但 Git 会看到变化。
P
Peter Mortensen

它应该是:

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

这张图片应该解释它的含义。

https://i.stack.imgur.com/ZXee5.jpg


这也意味着发送到 Subversion 的内容(如果您这样做)将进行转换。
P
Peter Mortensen

确保您已安装最新版本的 Git

在使用 Git(版本 2.7.1)时,我按照上一个答案 git config core.autocrlf false 中的方式进行了操作,但它不起作用。

然后它现在可以在升级 git(从 2.7.1 到 2.20.1)时工作。


我想你的意思是你有 git 2.17.1。我遇到了同样的问题并进行了更新,这也解决了它。很高兴看到你的回答!
P
Peter Mortensen

在记事本++中打开文件。转到菜单编辑 → EOL 转换。单击 Windows 格式。保存文件。


还可以尝试使用 git config --global core.autocrlf false 来防止 Git 在提交时将行尾设置为 Unix。跟进 git config core.autocrlf 以检查它是否确实设置为 false。
P
Peter Mortensen

OP 的问题与 Windows 相关,如果不转到目录,甚至在 Notepad++ 中运行文件,我就无法使用其他人,因为管理员没有工作......

所以不得不走这条路:

cd "C:\Program Files (x86)\Git\etc"
git config --global core.autocrlf false

P
Peter Mortensen

在两种不同的操作系统(Linux 和 Windows)中使用“代码”时,CRLF 可能会导致一些问题。

我的 Python 脚本是在 Linux Docker 容器中编写的,然后使用 Windows 的 Git Bash 推送。它给了我LF将被CRLF取代的警告。我没有多想,但后来当我开始脚本时,它说:

/usr/bin/env: 'python\r': 没有这样的文件或目录

现在,这是一个对您产生影响的 \r。 Windows 使用“CR” - 回车 - 在 '\n' 顶部作为换行符 - \n\r。这是你可能需要考虑的事情。


这一点应该更加强调! Windows 开发人员使用 docker 并启动 linux 容器是很常见的——如果您使用 git 引入 shell 脚本并将 LF 转换为 CRLF,它将中断。
P
Peter Mortensen

许多文本编辑器允许您更改为 LF。请参阅下面的 Atom 说明。它简单明了。

点击右下角的CRLF

https://i.stack.imgur.com/4qwaQm.png

在顶部的下拉列表中选择 LF

https://i.stack.imgur.com/l9b9Ll.png


P
Peter Mortensen

我只是有同样的错误。在 Windows 10 上安装 NVM NVM 后发生。

在所有级别设置 autoclrf 均无效。

在 CMD 中,我使用了:“git ls-files --eol”

i/lf    w/crlf  attr/             src/components/quotes/ExQuoteForm.js
i/lf    w/lf    attr/             src/components/quotes/HighlightedQuote.js

结论:

我制作的文件有不同的结局。

要更改文件并重置,请执行

git config core.autocrlf false
git rm --cached -r .
git reset --hard

虽然:

在某些项目中,我需要删除存储库并重新启动它。


P
Peter Mortensen

在 GNU/Linux shell 提示符下,dos2unixunix2dos 命令可让您轻松转换/格式化来自 MS Windows 的文件。


在某些版本的 Ubuntu(可能还有许多其他 Linux 发行版)中,默认情况下不安装它们。
P
Peter Mortensen

对于一般概念,其他答案非常棒。我遇到了一个问题,在更新警告后仍然发生在先前设置中已提交的现有存储库上。

添加 --renormalize 有助于,例如,

git add --renormalize .

the documentation

" 对所有跟踪的文件重新应用“清理”过程,以强制将它们再次添加到索引中。这在更改 core.autocrlf 配置或文本属性后很有用,以更正添加了错误 CRLF/LF 行结尾的文件。此选项暗示-u。”


确实已经改了。这个命令也适用于我。
N
Navin Singh rangar

CR 和 LF 是一组特殊的字符,有助于格式化我们的代码。

CR (/r) 将光标置于行首,但不创建新行。这就是 macOS 的工作方式。

LF (/n) 创建一个新行,但它不会将光标放在该行的开头。光标停留在最后一行的末尾。这就是 Unix 和 Linux 的工作方式。

CRLF (/r/f) 创建一个新行并将光标放在新行的开头。这就是我们在 Windows 操作系统中看到的方式。

总结一下:

LF(换行)

代表换行

用 /n 表示

在代码中创建一个新行

ASCII 码是 10。

由 Unix 和其他基于它的操作系统使用。

CR(回车)

代表回车

用 /r 表示

将光标放在一行的开头。

ASCII 码是 13。

由 macOS 及其前身使用。

CRLF(回车和换行)

代表 CARRIAGE RETURN 和 LINE FEED

用 /n/r 表示

创建一个新行并将光标放在该新行的开头。

ASCII 码是 10 表示 LF,13 表示 CR。

主要用于 Windows 操作系统。

Git 默认使用 LF。所以当我们在 Windows 上使用 Git 时,它会抛出类似“CRLF 将被 LF 替换”的警告,并自动将所有 CRLF 转换为 LF,从而使代码变得兼容。

注意:别担心……不要将此视为警告,而应将其视为通知消息。


“将 cursnew 行放在开头”是什么意思(似乎难以理解)?请通过 editing (changing) your answer 回复,而不是在评论中(没有“编辑:”、“更新:”或类似内容 - 答案应该看起来好像是今天写的)。
P
Peter Mortensen

我遇到了同样的问题,并且做 git add . && git reset 正确地恢复了所有行尾。