禁用git EOL转换

ima*_*ett 77 git

我试图让git不改变任何操作的任何行结尾.不幸的是,似乎这样做并不重要.我已将其缩减为以下测试用例,该测试用例具有尽可能多的不同机制来禁用此行为.


  • 从两台机器开始(Windows计算机= A,Linux计算机= B)
  • 在两台机器上: git config --global core.autocrlf false
  • 在两台机器上:( git config --global core.eol crlf以防万一)

  • 在A上创建新存储库.从空文件夹:
    • git init --shared(然后取消隐藏创建的.git目录)
    • .gitignore在存储库中创建一个新文件
    • .gitattributes使用单行在存储库中创建一个新文件:* -text
    • git add .,然后git commit -m "initial commit"解决,例如这个.
    • git branch master_recv
    • 添加遥控器
  • document.txt在包含CRLF的存储库中创建一个新文件
  • 承诺:git add -A那么git commit -m "<something>"
  • 请注意,A document.txt仍然包含CRLF(并删除它并重置并--hard返回仍然使用CRLF的版本)

  • SCP整个目录到电脑B.
  • 添加new file包含CRLF 的新文件
  • 承诺:git add -A那么git commit -m "<something>"
  • 请注意,B document.txt和B new file都仍包含CRLF

  • 将B的主人拉到A: git pull <remote> master:master_recv
  • A document.txt已经改为LF.添加的文件new file还包含LF.

如果B是Windows计算机,则不会发生此问题.

Gen*_*ene 62

在项目中,应该有一个.gitattributes文件.大多数时候,它应该是这样的: 在此输入图像描述

将*text = auto更改为*text = false.

像这样:

在此输入图像描述

如果您的项目没有.gitattributes文件,则行结尾由您的git配置设置.要更改您的git配置,请执行以下操作:

转到此目录中的配置文件:

1)C:\ ProgramData\Git\config

2)在Notepad ++(或您喜欢的任何文本编辑器)中打开配置文件

3)将"autocrlf ="更改为false.

在此输入图像描述

  • 为什么使用图片而不是代码标签?非常不方便 (29认同)
  • 因为我可以在图片中添加一个大红框以突出显示内容. (25认同)
  • 使用`*text = false`不会取消设置文本:它会将文本设置为字符串值false.这与未指定文本(未特别设置未设置)具有相同的效果.使用`*-text`为它提供特殊的未设置设置.取消设置路径上的text属性会告诉git在签入或签出时不尝试任何行尾转换. (14认同)
  • 这个答案**不**正确。正如下面@JustAMartin 和上面的评论部分所指出的,您必须使用`* -text` 而**不是** `* text=false`。在这个答案确定之前,我已经否决了它。请修正这个答案。 (5认同)
  • 对不起,我不能对这个答案表示感谢。我花了半天时间才发现有人遵循了误导性的建议。正如@JustAMartin指出的,“ * text = false”无效。请修正答案! (3认同)
  • 留下无法运行的代码,因为它曾经是正确的,这是故意误导读者 (2认同)

Von*_*onC 31

一个简单的解决方案是

  • 确保所有 repos的core.autocrlf设置为false :
    git config --global core.autocrlf false
  • 重新克隆您的仓库,并检查没有完成EOL转换.

如果有自动完成转换,则意味着回购中存在.gitattributes core.eol指令.

  • 今天不要使用`autocrlf`!未设置的 `autocrlf` 等价于 `false`。你落后于 Git 的流行趋势 (4认同)
  • 如上所述,我尝试过这个(尽管没有使用全局标志),但它不起作用。git 版本是“1.8.5.2”。 (4认同)

Max*_*Max 11

以下是对单个 repo 执行此操作的方法。

.gitattributes在 repo 的根目录中创建包含这一行的文件

* -text
Run Code Online (Sandbox Code Playgroud)

就是这样。这是一个匹配所有文件的通配符,告诉 git 取消设置 text 属性。这意味着 git 将所有文件视为二进制文件,因此不会执行任何行尾转换。

  • [gitattributes docs](https://git-scm.com/docs/gitattributes) 中的 @MatiasGrioni 它解释说“text”属性_仅_用于行结束标准化。所以取消它只会影响 git 的这方面。所有其他文本处理方面应该仍然没问题 (3认同)

ima*_*ett 7

我想到了.似乎SCP计划正在转换行结尾.当我故意制作一个带有LF结尾的文件然后观察它在下载时显示为CRLF时,我注意到了这一点.

由于这是我的解决方案,我接受了这个答案,但未来的人也应该参考其他答案以获得更通用的解决方案.


Laz*_*ger 5

来自gitattributes(5) 手册页“效果”主题

text

此属性启用并控制行尾规范化。对文本文件进行规范化后,其行尾将在存储库中转换为 LF。要控制在工作目录中使用的行结束样式,请eol对单个文件使用属性,core.eol 对所有文本文件使用配置变量。

Set

在路径上设置 text 属性可启用行尾规范化并将路径标记为文本文件。行尾转换无需猜测内容类型即可进行。

Unset 取消设置路径上的 text 属性会告诉 Git 在签入或签出时不要尝试任何行尾转换。

core.autocrlf在新的 (1.7.2+) Git 中未使用,core.eol正确设置|取消文本属性被认为是更可靠的方法

  • 经常令人困惑的重要事情 - 要取消设置 `text` 并防止任何转换,您应该将 .gitattributes 设置为 `* -text` 而不是 `* text=false`。`false` 不是 `text` 属性的有效值 - git 不会识别它,并且会回退到其默认的 autocrlf 设置。另外,更改“text”值后,您必须从本地存储库备份所有文件,进行提交,然后根据需要使用正确的行尾恢复文件,然后将它们提交回来。那么你的行尾将不会再被 git 修改。 (10认同)