禁用git EOL转换

时间:2014-02-17 06:58:04

标签: 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"来解决,例如this
    • 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计算机,则不会出现此问题。

5 个答案:

答案 0 :(得分:53)

在项目中,应该有一个.gitattributes文件。大多数情况下,它应该如下所示(或screen-shot}:

# 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以禁用自动处理(请参阅screen-shot)。

像这样:

enter image description here

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

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

1)C:\ ProgramData \ Git \ config

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

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

enter image description here

答案 1 :(得分:25)

一个简单的解决方案是:

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

如果自动完成转化,则表示回购中有.gitattributes core.eol directive

答案 2 :(得分:6)

我明白了。似乎SCP计划正在转换行结尾。当我尝试用LF结尾故意制作一个文件然后观察它在下载时显示为CRLF时,我注意到了这一点。

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

答案 3 :(得分:2)

这是您为单个存储库执行此操作的方式。

在存储库的根目录中创建文件.gitattributes,并在其中添加此行

* -text

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

答案 4 :(得分:1)

来自gitattributes(5) Manual Page“效果”主题

  

text

     

此属性启用和控制行尾标准化。当一个   文本文件被规范化,其行结尾被转换为LF   库。控制工作中使用的行结束样式   目录,使用单个文件的eol属性和core.eol   所有文本文件的配置变量。

     

Set

     

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

     

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

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