git add
添加了一些文件。我收到了警告信息:
这种转换会有什么影响?LF将被替换为CRLF
git add
添加了一些文件。我收到了警告信息:
这种转换会有什么影响?LF将被替换为CRLF
这些错误消息是由于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
代表Windows风格的行尾标记,lf
代表Unix风格的行尾标记(自Mac OS X以来也在Mac上使用)。
(对于上述三个选项中的任何一个,都不会影响pre-osx中的cr
。)
在Windows下什么时候会出现此警告?
- 如果您的文件中有Unix风格的lf
(=很少出现),则 autocrlf
=true
,
- 如果您的文件中有Windows风格的crlf
(=几乎总是),则 autocrlf
=input
,
- 如果 autocrlf
=false
,则永远不会出现此警告!
这个警告是什么意思?
警告“LF will be replaced by CRLF”表示:在提交-检出周期中,您的unix风格的LF(由于autocrlf
=true
)将被替换为Windows风格的CRLF,Git不期望您在Windows下使用Unix风格的LF。
警告“CRLF will be replaced by LF”表示:在提交-检出周期中,您的Windows风格的CRLF(由于autocrlf
=input
)将被替换为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
的“本地”(每个仓库) 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
,
- 除非你有充分的理由(例如,在 Windows 下使用 Unix 工具或遇到 makefile 问题),否则绝不使用 core.autocrlf
= input
。
PS:安装 Git for Windows 时应该选择什么?
如果您不打算在 Unix 下使用任何项目,请勿同意默认的第一个选项。选择第三个选项(检出为原样,提交为原样)。您将永远不会看到此消息。
PPS:我的个人偏好是将编辑器/IDE配置为使用 Unix 样式的换行符,并将 core.autocrlf
设置为 false
。
更新(2022)
自2018年以来,git可以使用 --renormalize 命令修复现有代码库中的行尾问题。
core.autocrlf
设置为输入模式吧。从您的回答中我理解到,将其设置为输入模式可以确保仓库和工作目录始终具有Unix风格的换行符。那么,为什么在Windows系统中您绝对不想要这样做呢? - Hubro.gitattributes
可以覆盖配置设置。 - digory dooinput
的好处在于,如果我无意中在某个地方使用了CRLF(比如你可能会在记事本中进行快速编辑而不是在配置良好的IDE中进行编辑),它就可以将我的行结束符转换为LF,同时不影响所有有意的LF。 使用false
的缺点是,如果我不小心使用了CRLF,可能会将其提交到仓库中。 input
可以防止这种情况发生! 所以input
> false
,对吗? - Henrik HeimbuergerGit有三种处理行尾的模式:
# This command will print "true" or "false" or "input"
git config core.autocrlf
您可以通过在上述命令行中添加一个附加参数true
或false
来设置要使用的模式。
如果core.autocrlf
设置为true,则表示每次将文件添加到Git存储库时,Git都会将所有CRLF行尾转换为仅LF,然后再将其存储在提交中。每当您git checkout
某些内容时,所有文本文件都会自动将其LF行尾转换为CRLF行尾。这允许跨使用不同行尾样式的平台开发项目,而不会因为每个编辑器始终一致地更改行尾样式而导致提交非常嘈杂。
这种方便的转换的副作用是,这就是您看到的警告的原因,如果您最初编写的文本文件具有LF行尾而不是CRLF,则通常会像往常一样以LF格式存储,但稍后检出时它将具有CRLF行尾。对于普通文本文件,这通常没问题。在这种情况下,警告只是“供您参考”,但是如果Git错误地将二进制文件评估为文本文件,则这是一个重要的警告,因为Git随后会破坏您的二进制文件。
如果core.autocrlf
设置为false,则永远不会执行换行符转换,因此将按原样检入文本文件。通常情况下,只要您的所有开发人员都在Linux上或全部在Windows上,这种方法就可以正常工作。但是根据我的经验,我仍然会得到具有混合行尾的文本文件,这最终会导致问题。
作为Windows开发人员,我的个人偏好是将设置保留为开启状态。
请参考git-config获取更新的信息,其中包括"input"值。
core.eol
设置进行比较,并结合.gitattributes
配置可能会更好。我一直在通过实验来弄清楚它们之间的差异和重叠,但是这非常令人困惑。 - seh如果您已经查看了代码,则文件已经被索引。更改Git设置后,例如通过运行以下命令:
git update-index --no-assume-unchanged <file>
git config --global core.autocrlf input
您应该使用以下方法刷新索引:
git rm --cached -r .
使用以下命令重写 Git 索引:
git reset --hard
注意:这将删除您的本地更改。在执行此操作之前,请考虑将它们存储起来。
来源:配置 Git 处理行尾
core.autocrlf
设置并且想要在运行git reset --hard
命令后不重新转换行尾符号,那么你需要使用命令git rm --cached -r .
来清理Git索引。这个命令可以使得修改的设置生效。 - wisbuckygit add --renormalize .
。因此,自2015年以来,推荐的操作程序可能已更改。@user2630328也许可以详细说明一下区别。 - Daniel K.git config core.autocrlf false
autocrlf
设置为false
只是把问题推给了你项目的每个用户。 - jpaughgit config --global core.autocrlf false
命令代替。 - Michaël Polla--u2d,-D 执行UNIX -> DOS转换
。 - Larry Battledos2unix -D
会将 Windows 的换行符转换为 Linux 的换行符。
这不就是 DOS(CRLF) -> UNIX(LF) 转换吗?
然而,dos2unix -h
显示 -D
将执行 UNIX(LF) -> DOS(CRLF) 转换。
dos2unix
更多信息:http://gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix - Larry BattleWindows Bash
,但似乎不支持dos2unix 6.0.4(2013-12-30)中的-D
或--u2d
开关。 - Andrei Krasutski谈到这个主题时,通常会提到一篇关于行尾的GitHub文章。
在我的个人经验中,使用经常推荐的 core.autocrlf
配置设置效果很不稳定。
我正在使用带有Cygwin的Windows,在不同时间处理Windows和Unix项目。即使是我的Windows项目有时也会使用需要Unix(LF)行结尾的Bash shell脚本。
对于像我这样的混合环境,将全局 core.autocrlf
设置为任何选项都无法良好运作。尽管该选项可以在本地(存储库)Git配置上设置,但即使在包含Windows和Unix相关内容的项目中(例如,我有一个带有一些Bash实用程序脚本的Windows项目),那也不够好。
我发现最好的选择是创建每个存储库的.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
在我的一个项目存储库中:* 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
设置需要做更多的事情,但每个项目只需一次,并且在使用该项目时任何操作系统上的贡献者都不会遇到换行符的问题。
text=false eol=false
的作用与 binary
类似。这个听起来对吗?指明“我知道这些是文本文件,但我不想将它们标准化”可能会很有用。 - joeytwiddle我认为Basiloungas的回答是接近答案的,但已经过时了(至少在Mac上)。
打开~/.gitconfig文件并将safecrlf
设置为false:
[core]
autocrlf = input
safecrlf = false
那样似乎会忽略换行符(不过对我来说起作用了)。
safecrlf
(带有“f”)。 - alpipego:e YOURFILE
ENTER),然后:set noendofline binary
:wq
vim
进行编辑将保留所有行结尾。 - esengineer我之前也遇到过这个问题。
SVN 不进行任何行尾转换,因此提交的文件将保留 CRLF 行尾。如果你使用 git-svn 将项目放入 git 中,则CRLF 行尾会继续保留在 git 存储库中,而这不是 git 预期发现自己处于的状态——默认情况下仅检查 unix/linux(LF) 行尾。
然后,在 windows 上检出文件时,autocrlf 转换会保持文件原样(因为它们已经具有当前平台的正确行尾),但是决定是否与检入文件存在差异的过程在比较之前执行反向转换,结果是将检出文件中的 LF 与存储库中意外的 CRLF 进行比较。
据我所见,你的选择是:
脚注: 如果你选择选项#2,则我的经验是一些辅助工具(rebase、patch 等)无法处理 CRLF 文件,你最终将拥有混合 CRLF 和 LF(不一致的行尾)的文件。我不知道有什么方法可以同时达到两者的最佳效果。
Windows中的大多数工具也接受文本文件中的简单LF。例如,您可以在名为“.editorconfig”的文件中控制Visual Studio的行为,并使用以下示例内容(部分):
Most of the tools in Windows also accepts a simple LF in text files. For example, you can control the behaviour for Visual Studio in a file named '.editorconfig' with following example content (part):
indent_style = space
indent_size = 2
end_of_line = lf <<====
charset = utf-8
只有原版的Windows 记事本 无法与LF一起使用,但还有一些更合适的简单编辑器工具可用!
因此,在Windows中的文本文件中应该使用LF。这是我的信息,并且强烈推荐!没有任何理由在Windows中使用CRLF!
(同样的讨论也出现在C / C ++中包含路径中使用 \
。那是牛粪。使用斜杠#include <pathTo / myheader.h>,它是C / C ++标准,所有Microsoft编译器都支持它)。
因此,Git的正确设置为:
git config core.autocrlf false
我的信息:忘记像 dos2unix 和 unix2dos 这样的旧思维程序。在你的团队中要明确,LF 在 Windows 下是适用的。