禁用 git EOL 转换

我试图让 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 commit -m "initial commit",例如 这个
    • git branch master_recv
    • 加上遥控器
  • 在包含 CRLF 的存储库中创建一个新文件 document.txt
  • 提交: git add -A,然后 git commit -m "<something>"
  • 请注意,A 的 document.txt仍然包含 CRLF (并且删除它并使用 --hard重置返回仍然使用 CRLF 的版本)

  • 将整个目录 SCP 到计算机 B
  • 添加包含 CRLF 的新文件 new file
  • 提交: 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 计算机,则不会出现此问题。

107325 次浏览

一个简单的解决办法是:

  • 确保 core.autocrlf 在 所有回购协议中设置为 false:
    git config --global core.autocrlf false
    • Git 2.16(Q12018)及以上 ,运行 git add --renormalize .
    • 否则,重新克隆您的回购,并检查没有 EOL 转换完成。

如果有转换自动完成,这意味着一个 .gitattributes core.eol指令是在那里的回购。

使用 Git 2.8 + (2016年3月),检查是否仍然有 eol 转换:

git ls-files --eol

来自 Gitproperties (5)手册页“特效”主题

text

此属性启用并控制行结束标准化 文本文件,其行结尾将在 控制在工作中使用哪种行结束样式 目录中,对单个文件使用 eol属性,对 core.eol使用 所有文本文件的配置变量。

Set

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

取消路径上的文本属性告诉 Git 不要这样做 在签入或签出时尝试任何行结束转换。

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

我想通了。看起来 SCP 程序正在转换行尾。我注意到这一点,当我试图故意制作一个文件与低频结束,然后观察它出现作为 CRLF 时下载。

因为这是我的解决方案,所以我接受这个答案,但是未来的人们也应该参考其他的答案,找到一个更通用的解决方案。

在您的项目中,应该有一个 .gitattributes文件。大多数时候,它应该看起来如下(或者这个 屏幕截图) :

# Handle line endings automatically for files detected as text
# and leave all files detected as binary untouched.
* text=auto


# Never modify line endings of our bash scripts
*.sh -crlf


#
# The above will handle all files NOT found below
#
# These files are text and should be normalized (Convert crlf => lf)
*.css           text
*.html          text
*.java          text
*.js            text
*.json          text
*.properties    text
*.txt           text
*.xml           text


# These files are binary and should be left untouched
# (binary is macro for -text -diff)
*.class         binary
*.jar           binary
*.gif           binary
*.jpg           binary
*.png           binary

* text=auto更改为 * text=false以禁用自动处理(参见 屏幕截图)。

像这样:

enter image description here

如果您的项目没有。属性文件,然后由您的 git 配置设置行尾。要更改您的 git 配置,请执行以下操作:

转到这个目录中的配置文件:

  1. C: ProgramData Git 配置

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

  3. 将“ autocrlf =”更改为 false。

enter image description here

对于 TortoiseGIT 的用户: 自动 CrLf 转换器设置在图形用户界面的 GIT部分。

这里是如何做到这一点,为一个单一的回购。

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

* -text

就是这样。这是一个匹配所有文件的通配符,告诉 git 取消 text 属性。这意味着 git 在执行行结束标准化时将所有文件作为非文本对待,完全禁用它。其他特定于文本的 git 命令不受影响。只有结束正常化的行被更改。