如何更改行尾设置

877

是否有一个文件或菜单可以让我更改处理行结尾的设置?

我看到有3个选项:

  1. 将检出Windows风格,提交Unix风格

    Git将在检出文本文件时将LF转换为CRLF。在提交文本文件时,CRLF将转换为LF。对于跨平台项目,在Windows上推荐使用此设置("core.autocrlf"设置为"true")

  2. 按原样检出,提交Unix风格

    Git不会在检出文本文件时执行任何转换。在提交文本文件时,CRLF将转换为LF。对于跨平台项目,在Unix上推荐使用此设置("core.autocrlf"设置为"input")。

  3. 按原样检出和提交

    Git不会在检出或提交文本文件时执行任何转换。不建议选择此选项用于跨平台项目("core.autocrlf"设置为"false")


9
可能是重复的问题:如何在Windows下强制Git使用LF而不是CR+LF? - Alastair Irvine
7
哪一个是默认值? - Stephen
64
我发现第三个选项效果更好。否则,我经常会遇到这样的情况:在同一平台(Windows/Linux)上编辑批处理脚本和 sh 脚本,然后提交它们,Git 会自动 "修复" 一个平台的行末符号...不,我宁愿自己了解行末符号,并将它们按照原样提交/检出。 - JustAMartin
7
同意@JustAMartin的观点,让系统搞乱你的行尾是引入错误的绝佳方式,这将花费整整一天的时间来追踪和修复,我刚刚就经历了这种情况。现在Windows上的所有优秀编辑器和IDE都完全支持LF行尾,因此没有必要进行转换。 - Neutrino
4
@Neutrino 我希望这是真的,但一个混淆你行尾的IDE(并且没有提供合理的配置选项来关闭此功能)的例子是Visual Studio。 - Cássio Renan
显示剩余8条评论
8个回答

774
正常的控制方式是使用git config 例如
git config --global core.autocrlf true

有关详情,请在此链接到 Pro Git 中向下滚动,找到名为 "core.autocrlf" 的部分


如果你想知道这保存在哪个文件中,你可以运行以下命令:

git config --global --edit

git全局配置文件应该在文本编辑器中打开,你可以看到该文件是从哪里加载的。

75
“input”是第三个选项(如我提供的链接所述)。这3个选项分别为“true” | “false” | “input”。 - CodingWithSpike
4
这里有另一个关于此主题的好问题:https://dev59.com/BXA75IYBdhLWcg3wm6Uj - CodingWithSpike
37
实际上,如果您重新阅读自己的问题,并查看复制/粘贴的摘录部分:"1 ...("core.autocrlf"设置为"true")... 2 ...("core.autocrlf"设置为"input")... 3 ...("core.autocrlf"设置为"false")",所以您基本上已经回答了自己的问题? :) - CodingWithSpike
4
这是一种旧的解决方法。请查看.gitattributes文件。 - eftshift0
3
需要注意的是,在更改此设置后,建议执行 git rm --cached -r .,然后执行 git reset --hard 以重写工作树中的所有文件。这样做会丢失未提交的更改! - joki
显示剩余4条评论

284

操作系统中使用的行尾格式:

  • Windows:CR(回车符 \r)和 LF(换行符 \n)配对
  • OSX、Linux:LF(换行符 \n)

我们可以通过两种方式配置git自动纠正每个操作系统的行尾格式。

  1. 全局配置
  2. 使用 .gitattributes 文件

全局配置

在 Linux/OSX 中

git config --global core.autocrlf input

当您提交时,这将修复任何 CRLFLF

在Windows中

git config --global core.autocrlf true

这样做可以确保在Windows上结账时,所有的LF都会被转换为CRLF。
.gitattributes文件
保留一个.gitattributes文件是个好主意,因为我们不希望每个团队成员都要设置自己的配置。这个文件应该放在存储库的根目录下,如果存在,git将会尊重它。
* text=auto

这将把所有文件都视为文本文件,并在检出时自动转换为操作系统的行尾,并在提交时自动转换回LF。如果您想明确指定行尾,可以使用以下方法:
* text eol=crlf
* text eol=lf

第一个是用于结账,第二个是用于提交。
*.jpg binary

这将把所有的.jpg图片都视为二进制文件,无论路径如何。所以不需要进行转换。
或者你可以添加路径限定符:
my_path/**/*.jpg binary

4
OS X使用单独的 CR(回车符),这怎么办? - jww
33
旧版的MacOS(即MacOS 9及之前的版本)使用单独的CR,但OS X通常使用LF - Zachary Ware
3
在Windows上,我可以使用“* text eol=lf”两次来使其检出时采用LF吗? - mbomb007
6
根据gitattributes文档,将* text=auto设置为可以让Git决定内容是否为文本。如果要强制所有文件都是文本,则应该只设置为* text - Adrian W
1
其中哪些是关闭的 - 别碰我的文件 - 我的文件保持原样 - 不要更改任何内容? - Martin
2
第一个是用于结账,第二个是用于提交。你确定吗?我没有看到支持这一点的文档。 - CervEd

39
对于一个可重新分发给所有开发人员的存储库设置解决方案,请查看text属性在.gitattributes文件中。这样,开发人员不必手动设置存储库中的行尾,并且由于不同的存储库可以具有不同的行尾样式,全局core.autocrlf不是最好的选择,至少在我看来。
例如,在给定路径[ . - 文本]上取消此属性将强制git在签入和签出时不触及行尾。在我看来,这是最好的行为方式,因为大多数现代文本编辑器都可以处理两种类型的行尾。此外,如果您作为开发人员仍想在签入时进行行尾转换,则仍然可以将路径设置为匹配某些文件或在您的存储库上设置eol属性(在.gitattributes中)。

另外请查看这篇相关文章,其中更详细地描述了.gitattributes文件和文本属性: 如何在Git中最佳处理CRLF(回车符,换行符)?


. - text gives is not a valid attribute name: .gitattributes:1 please put cat .gitattributes - jangorecki

19

.gitattributes文件

最简单的方式是在您的存储库中使用本地的.gitattributes文件。

您也可以为特定文件扩展名更改行尾。

*           text=auto     # auto
*.txt       text
*.vcproj    text eol=crlf # windows line-endings
*.sh        text eol=lf   # linux line-endings
*.jpg       -text

这也覆盖了全局默认设置,因此更加易于移植,并使存储库在不同机器上更加可靠。


6
您需要在行末删除注释,以防止在检出过程中出现“# 不是有效的属性名称:.gitattributes:1”错误。 - Zoltán Barics
如果您想针对特定子文件夹中的文件执行此操作:path/to/subfolder/*.sh。递归执行:path/to/subfolder/**/*.sh - stackprotector

13

对我来说有效的方法是运行该命令

git config auto.crlf false

在项目文件夹中,我想特别为一个项目进行此操作。

这个命令会更改位于路径 {project_name}/.git/config 的文件(.git 是一个隐藏文件夹),并添加以下行:

[auto]
    crlf = false

在文件结尾处。我想更改文件也会起同样的作用。


谢谢!我尝试了在WSL中设置core.autocrlf=false,但是没有成功,而GitBash和IntelliJ则没有问题。 - GameDroids

6

针对 Windows 中的“按原样结帐,按原样提交”选项:

git config --global core.autocrlf false

这不会修改任何行结尾。


2

如果你想将从PC格式转换为UNIX格式的文件格式转换回来。

(1)你需要重新安装Tortoise GIT,并在“行尾转换”部分确保选择了“按原样签出 - 按原样签入”的选项。

(2)并保持其余配置不变。

(3)安装完成后

(4)将所有转换为UNIX格式的文件扩展名写入一个文本文件(extensions.txt)中。

ex:*.dsp
   *.dsw

(5) 将文件复制到您的克隆中 在GITBASH中运行以下命令

while read -r a;
do
find . -type f -name "$a" -exec dos2unix {} \;
done<extension.txt

1

以下步骤适用于我:

在根项目文件夹上添加git属性(这将对即将到来的文件有用)

* text=auto

*.tf  eol=lf
*.tfvars  eol=lf
*.yml  eol=lf

执行以下命令以为已存在的文件提供支持:
find ./ -type f \( -iname \*.tf -o -iname \*.tfvars -o -iname \*.md -o -iname \*.yml \) -print0 | xargs -0 dos2unix

dos2unix .gitignore
dos2unix .gitattributes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接