git用CRLF代替LF

mrb*_*lah 777 git

使用bash在Windows XP计算机上运行git.我从SVN导出了我的项目,然后克隆了一个裸存储库.

然后我将导出粘贴到裸存储库目录中,并执行了:

git add -A
Run Code Online (Sandbox Code Playgroud)

然后我得到一条消息列表:

LF将由CRLF取代

这种转变的后果是什么?这是Visual Studio中的.NET解决方案.

Ant*_*ins 842

这些消息是由于core.autocrlfWindows上的默认值不正确造成的.

其概念autocrlf是透明地处理行结尾转换.它确实如此!

坏消息:需要手动配置值.
好消息:每个git安装应该只进行一次(每个项目设置也可以).

如何autocrlf工作:

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

        repo                     repo                     repo
      ^      V                 ^      V                 ^      V
     /        \               /        \               /        \
crlf->lf    lf->crlf     crlf->lf       \             /          \      
   /            \           /            \           /            \
Run Code Online (Sandbox Code Playgroud)

这里crlf= win-style end-of-line marker,lf= unix-style(和mac osx).

(前osx cr未受上述三种选择中的任何一种影响)

该警告何时显示(在Windows下)

    - autocrlf= true如果你的lf某个文件中有unix-style (= RARELY),
    - autocrlf= input如果你的crlf某个文件中有win-style (=几乎总是),
    - autocrlf= false- 从来没有!

这个警告意味着什么

警告" LF将由CRLF替换 "表示你(拥有autocrlf= true)将在提交结账周期后丢失你的unix风格的LF(它将被windows风格的CRLF取代).Git不希望你在windows下使用unix风格的LF.

警告" CRLF将被LF替换 "表示你(拥有autocrlf= input)将在提交结账周期后丢失你的windows风格的CRLF(它将被unix风格的LF取代).不要input在windows下使用.

另一种展示如何autocrlf运作的方式

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x
Run Code Online (Sandbox Code Playgroud)

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

file to commit -> repository -> checked out file
Run Code Online (Sandbox Code Playgroud)

怎么修

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

   - "全球"(每用户)gitconfig位于~/.gitconfig,另一个
   -在"全球"(每用户)gitconfig $XDG_CONFIG_HOME/git/config$HOME/.config/git/config
   - "本地"(每回购)gitconfig在.git/config在工作目录.

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

   - 添加autocrlf=false到系统范围的gitconfig#per-system解决方案
   - git config --global core.autocrlf false            #per-user solution
   - git config --local core.autocrlf false              #per-project solution

警告
- git config设置可以覆盖gitattributes设置.
- crlf -> lf只有在添加新文件时才会进行转换,crlf回购中已存在的文件不会受到影响.

道德(适用于Windows):
    - use core.autocrlf= true如果您打算在Unix下使用此项目(并且不愿意将编辑器/ IDE配置为使用unix行结尾),
    - 如果您计划仅在Windows下使用此项目,则使用core.autocrlf= false(或者您已将编辑器/ IDE配置为使用Windows行结尾),
    - 从不使用core.autocrlf= input除非您有充分理由(例如,如果您在Windows下使用unix实用程序或遇到makefile问题),

PS 安装适用于Windows的git时要选择什么?
如果您不打算在Unix下使用任何项目,请不要同意默认的第一个选项.选择第三个(Checkout as-is,commit as-is).你不会看到这条消息.永远.

PPS我的个人偏好是配置编辑器/ IDE以使用Unix风格的结尾,并设置core.autocrlffalse.

  • 因为我花了这么多时间,我希望有一个core.crlf = rackoff ;-) (26认同)
  • 如果您已将编辑器配置为使用Unix样式结尾,为什么不将`core.autocrlf`设置为输入?根据我从您的答案中收集的内容,将其设置为输入可确保存储库和工作目录始终具有unix样式的行结尾.为什么你*永远不会*想要在Windows中? (13认同)
  • 我重新构建了内容,也许这样会更容易阅读 (10认同)
  • 这太令人困惑了.我在编辑器中设置了LF.所有的repo代码都使用LF.global autocrlf设置为false,我的home dir中的核心gitconfig设置为false.但我仍然将消息LF替换为CRLF (8认同)
  • 对不起,我希望我的评论不会被视为对你答案的批评.在找到这个答案之前,我的意思是"达到这个目标". (7认同)
  • @AntonyHatchkins利润是'输入'将转换我的行结尾,如果我偶然*在某个地方有一个CRLF(也许你曾经在记事本中快速编辑而不是你配置得很好的IDE!),而不会影响所有的故意LF类.使用`false`的缺点是,如果我有意外的CRLF,我可能会意外地将它提交给回购.`输入`会阻止它!所以`input`>`false`,不是吗? (5认同)
  • 哦,没关系:)无论如何,你的评论促使我改进我的答案. (3认同)
  • 弄清楚:.gitattributes可以覆盖配置设置. (3认同)
  • 这是一个例子.在我正在使用的项目中有很多html文件(除了我的python文件).负责这些文件的人正在使用Windows,我通常在Linux上工作,但有时也在Windows上工作.即使与这些html文件无关,每次我提交更改时,`input`选项也会将他的crlf转换为lf.并且它会将所有文件标记为历史记录中的更改以及打破其正常工作流程.将更改自动注入您不负责的文件是一种不好的做法. (3认同)
  • 对于*解释*这是一个很好的答案;对于 *推荐* 它已经严重过时了 - 看看为什么 [gitattributes supercedes autocrlf](/sf/answers/4175090811/) (3认同)
  • git config core.autocrlf=false 给出错误。它应该是: git config core.autocrlf false (空格而不是“=”) (2认同)
  • 那是因为我可能会遇到奇怪的错误(例如[无法删除工作树更改](http://stackoverflow.com/questions/2825428/why-should-i-use-core-autocrlf-true-in-git))和不可能在一个项目中同时拥有两种类型的行结尾(例如 .bat 和 .sh 文件)比在正常工作流程中无法得到的明显警告更重要。 (2认同)
  • 不过有些奇怪。我在全局和本地配置中都将 core.autocrlf 设置为 false,但在尝试提交时仍然收到警告。git 版本是 2.7.0 (2认同)
  • 我同意 [与 Hubro](http://stackoverflow.com/questions/1967370/git-replacing-lf-with-crlf#comment42404705_20653073):很好的解释,但我不明白为什么正确的结果不会是“设置当 IDE 配置为使用 LF 时,使用`input`,永远不要使用`false`”。我不明白在您概述了所有内容之后,您如何得出永远不要使用“输入”的结论。 (2认同)
  • @hheimbuerger我?记事本?从来没有:)我只使用记事本来删除剪贴板中的非文本内容(例如超链接),方法是粘贴然后从记事本中复制. (2认同)
  • @AntonyHatchkins 这并不能解释为什么 `false` 比 `input` 更好。两者都是 VCS 的配置,因此在完全关于 VCS 配置的讨论中,说“依赖 VCS 是一个坏习惯”是一个奇怪的论点。即使您认为不应该依赖它,您仍然需要选择两者之一。 (2认同)
  • @bruno最好设置你的编辑器在windows中使用linux行结尾并设置`autocrlf = false` (2认同)
  • @Hubro因为它默默地更改文件,所以这不是一件好事。以 CRLF 结尾的文件应该保持这种方式。否则,您可能会面临批处理文件不再工作并可能更改二进制文件的风险。我看到很多将 LF 更改为 CRLF 或反之亦然的情况,导致其他地方出现一些错误。将其设置为 false 并通过将编辑器设置为使用 LF 来对所有可能的文本文件使用 LF。 (2认同)

And*_*ott 747

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

$ git config core.autocrlf
# that command will print "true" or "false" or "input"
Run Code Online (Sandbox Code Playgroud)

您可以通过向上面的命令行添加true或的附加参数来设置要使用的模式false.

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

这个方便转换的副作用,这就是你所看到的警告,就是如果你最初创作的文本文件有LF结尾而不是CRLF,它将像往常一样用LF存储,但是当检查时以后它会有CRLF结局.对于普通文本文件,这通常很好.在这种情况下,警告是"为了您的信息",但是如果git错误地将二进制文件评估为文本文件,那么这是一个重要的警告,因为git会破坏您的二进制文件.

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

我个人的偏好是作为Windows开发人员打开设置.

有关包含"输入"值的更新信息,请参阅http://kernel.org/pub/software/scm/git/docs/git-config.html.

  • 如上所述(http://stackoverflow.com/questions/1249932/git-1-6-4-beta-on-windows-msysgit-unix-or-dos-line-termination/1250133#1250133),我会恭敬地不同意并将该设置保留为OFF(并使用Notepad ++或任何其他能够处理的编辑器 - 并保持原样 - 它找到的任何结束行字符) (114认同)
  • 我喜欢这个答案,并且更喜欢将autocrlf设置为true.作为替代方案,有没有办法自动终止警告消息? (22认同)
  • 通过与`core.eol`设置的比较来增加这个写得很好的答案,或许与`.gitattributes`配置一致,这将是很好的.我一直试图通过实验找出差异和重叠,这非常令人困惑. (11认同)
  • 是否有任何简单的方法来压制警告?我希望它是真实的,并知道我已将其设置为true.我不需要一直看到所有警告......没关系,真的......:p (9认同)
  • 要获得更持久的解决方案,请将.gitconfig更改为:[core] autocrlf = false (5认同)
  • 为什么消息说将进行LF-> CRLF转换?由于在Windows环境中工作,因此在向回购添加文件时,转换不是CRLF-> LF吗? (2认同)
  • @Krisc迟到的答案,但是仅仅抑制警告的方法是将`core.safecrlf`设置为`false`:http://stackoverflow.com/a/14640908/567000 (2认同)

小智 131

如果您已经签出了代码,则文件已经编入索引.更改您的git设置后,您应该刷新索引

git rm --cached -r . 
Run Code Online (Sandbox Code Playgroud)

并重写git索引

git reset --hard
Run Code Online (Sandbox Code Playgroud)

https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings

  • 感谢您使用一种简单,跨平台,清晰的FIX方式,而不是关于配置含义的大量讨论. (18认同)
  • 是的,您的本地更改将丢失.--hard参数重置索引和工作树,因此将丢弃对跟踪文件的任何更改.https://git-scm.com/docs/git-reset (5认同)
  • 您提供的链接(关于更改 core.autocrlf 配置后刷新存储库)不使用您建议的命令,而是使用“git add --renormalize”。所以也许推荐的过程自 2015 年以来已经改变了?@user2630328也许你可以详细说明其中的区别。 (3认同)
  • 如果git reset - hard我的本地更改可能会丢失吗?我只是按照上面的所有评论 (2认同)
  • `git rm --cached -r .`是什么意思?为什么`git reset --hard`还不够? (2认同)
  • @gavenkoa @max您需要`git rm --cached -r'。如果在更改`core.autocrlf`设置后执行`git reset –hard`,它将不会重新转换行尾。您需要清理git索引。 (2认同)

小智 80

git config core.autocrlf false
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这是如何有用的.一半的人要求autocrlf才能使其正常工作,另一半需要它是假的/输入.那么,他们应该把这些一次性的答案随机地扔到他们的控制台墙上,直到有什么东西坚持并且有点"有效"?这没有效果. (16认同)
  • 确保在存储库根目录中运行此命令 (5认同)
  • @pixelwiz:此命令仅为项目设置属性(因此您需要在git存储库下运行它).如果要全局设置,请改用`git config --global core.autocrlf false`. (5认同)
  • @mbb将`autcrlf`设置为`false`只是将问题解决给项目的每个用户. (2认同)

Rif*_*fat 47

无论unix2dosDOS2UNIX的是与gitbash窗口可用.您可以使用以下命令执行UNIX(LF) - > DOS(CRLF)转换.因此,你不会收到警告.

unix2dos filename
Run Code Online (Sandbox Code Playgroud)

要么

dos2unix -D filename
Run Code Online (Sandbox Code Playgroud)

但是,不要在任何现有的CRLF文件上运行此命令,那么每隔一行就会得到空的换行符.

dos2unix -D filename不适用于所有操作系统.请检查此链接是否兼容.

如果由于某种原因你需要强制命令然后使用--force.如果它说无效则使用-f.

  • 它有什么作用? (8认同)

Gen*_* S. 26

我认为@ Basiloungas的答案很接近但过时了(至少在Mac上).

打开〜/ .gitconfig文件并设置safecrlf为false

[core]
       autocrlf = input
       safecrlf = false
Run Code Online (Sandbox Code Playgroud)

那个*会让它忽略行char的结尾(无论如何都为我工作).


Gen*_*sky 20

一个GitHub的就行结束文章谈论这个话题时,通常提及.

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

我正在使用Windows与Cygwin,在不同时间处理Windows和UNIX项目.甚至我的Windows项目有时也会使用bashshell脚本,这需要UNIX(LF)行结尾.

使用GitHub推荐core.autocrlf的Windows设置,如果我检查出一个UNIX项目(它在Cygwin上运行得很好 - 或者我正在为我在Linux服务器上使用的项目做贡献),那么用Windows检查文本文件(CRLF) )行结尾,造成问题.

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

我发现的最佳选择是创建per-repository .gitattributes文件.在GitHub的文章提到它.
该文章的例子:

# 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
Run Code Online (Sandbox Code Playgroud)

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

* 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
Run Code Online (Sandbox Code Playgroud)

设置更多的东西,但是每个项目都要做一次,任何操作系统上的任何贡献者在使用这个项目时应该没有线路结尾的麻烦.


Rom*_*rov 18

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

:set noendofline binary
:wq
Run Code Online (Sandbox Code Playgroud)

  • 简单地使用`vim`进行编辑会使所有行结束完整. (2认同)

Tim*_*ell 14

我也有这个问题.

SVN不进行任何行结束转换,因此提交的文件的CRLF行结尾不变.如果你然后使用git-svn将项目放入git中,那么CRLF结尾会持续存储到git存储库中,这不是git期望找到的状态 - 默认情况下只有unix/linux(LF)行结束入住.

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

据我所知,您的选择是:

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

脚注:如果你选择#2选项,那么我的经验是一些辅助工具(rebase,patch等)不能处理CRLF文件,你迟早会遇到混合了CRLF和LF的文件(不一致的行)结局).我知道无法充分发挥两者的优势.

  • 我认为有一个第四个选项可以添加到您的列表中,假设有人能够重写历史记录:您可以使用git-svn最初创建的git repo,并将其历史记录重写为不再具有CRLF换行符.这将使您在整个svn历史中向后延伸的标准化换行符.用户keo在http://stackoverflow.com/a/1060828/64257上提供了一个解决方案. (2认同)
  • @sleske 从 git 2.8 开始,合并标记将“不再”引入混合行结尾。请参阅http://stackoverflow.com/a/35474954/6309 (2认同)

bas*_*gas 11

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

* text=auto

将阻止git在第一位检查行结尾.

  • 不正确.该行(如果存在)将覆盖*core.autocrlf的配置.如果将其设置为"true",则不,删除该行不会阻止git检查行结尾. (6认同)
  • 赞这个!!尽管“将阻止git检查”部分在技术上不正确,但这是唯一的答案,它专门提到了.gitattributes中的text =设置(如果存在,它将成为阻止程序)。因此,其他答案是不完整的。我正在* nuts *尝试弄清楚为什么无论我更改`autocrlf`和`safecrlf`设置并检出并清除了git缓存并进行了硬重置,我的文件为何仍然显示为“已修改”。 (2认同)

Har*_*rig 11

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

 indent_style = space
 indent_size = 2
 end_of_line = lf    <<====
 charset = utf-8
Run Code Online (Sandbox Code Playgroud)

只有原始的 Windows 记事本不能与 LF 一起使用,但有一些更合适的简单编辑器工具可用!

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

(同样的讨论是在 C/++ 中的包含路径中使用 \,这是胡说八道,使用 #include <pathTo/myheader.h> 和斜杠!,这是 C/++ 标准,所有微软编译器都支持它)。

因此 git 的正确设置是

git config core.autocrlf false
Run Code Online (Sandbox Code Playgroud)

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


Xia*_*com 9

它应该是:

警告:( 如果您检出/或克隆到当前core.autocrlf的另一个文件夹true,)LF将被CRLF取代

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

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


Mic*_*ons 7

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/

echo "* -crlf" > .gitattributes 
Run Code Online (Sandbox Code Playgroud)

在单独的提交中执行此操作,或者当您进行单个更改时,git可能仍会将整个文件视为已修改(取决于您是否更改了autocrlf选项)

这个确实有效.Git将尊重混合行结束项目中的行结尾,而不是警告你.

  • 当您要在CRLF和LF之间进行转换,但是您有几个必须完整的.sh文件时,此功能特别有用。我一直在使用* .sh -crlf ... (2认同)

小智 7

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

\n

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

\n
\n

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

\n
\n

现在这\\r对你来说是一个影响。Windows 在 \'\\n\' 之上使用“CR” - 回车符 - 作为换行符 - \\n\\r。这是你可能需要考虑的事情。

\n


小智 7

确保你已经安装了最新的 git。
git config core.autocrlf false在使用 git(2.7.1 版)时按上述方法操作,但没有奏效。
然后它现在在升级 git (从 2.7.1 到 2.20.1)时工作。


jab*_*cky 7

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

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

git add --renormalize .

文档中:

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


小智 7

我刚刚遇到了同样的错误。\n它是在 Windows\xc2\xa010 上安装 NVM NVM后发生的。

\n

在所有级别设置 autoclrf 都不起作用。

\n

在CMD中我使用:git ls-files --eol

\n
i/lf    w/crlf  attr/             src/components/quotes/ExQuoteForm.js\ni/lf    w/lf    attr/             src/components/quotes/HighlightedQuote.js\n
Run Code Online (Sandbox Code Playgroud)\n

结论:

\n

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

\n

要更改文件并重置,请执行以下操作

\n
i/lf    w/crlf  attr/             src/components/quotes/ExQuoteForm.js\ni/lf    w/lf    attr/             src/components/quotes/HighlightedQuote.js\n
Run Code Online (Sandbox Code Playgroud)\n

虽然:

\n

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

\n


Joe*_*ams 6

我对Windows上的git知之甚少,但......

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

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

总之,您可能不需要为此转换烦恼太多.但是,如果你将项目归档为tarball,那么编码人员可能会喜欢使用LF线路终结器而不是CRLF.根据您的关注程度(并且取决于您不使用记事本),如果可以,您可能需要设置git以使用LF返回:)

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

  • 由于似乎没有人说过,CR代表"回车"而LF代表"换行".作为第二个注释,许多Windows编辑器将默默地更改文本文件,其中LF字符表示换行符,而不是CRLF字符对.编辑的用户甚至不会收到警告,但Git会看到更改. (4认同)

小智 5

  1. 在 Notepad++ 中打开文件。
  2. 转到编辑/EOL 转换。
  3. 单击 Windows 格式。
  4. 保存文件。

  • 还可以尝试使用“git config --global core.autocrlf false”来防止 Git 在提交时将行结尾设置为“Unix”。跟进 `git config core.autocrlf` 检查它确实设置为 false。 (2认同)

小智 5

OP 的问题与 Windows 相关,我无法使用其他人而不进入目录甚至在 Notepad++ 中运行文件,因为管理员不起作用..所以不得不走这条路:

C:\Program Files (x86)\Git\etc>git config --global core.autocrlf false
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

560632 次

最近记录:

5 年,11 月 前