禁用git EOL转换

iqjalb3h  于 2023-01-07  发布在  Git
关注(0)|答案(6)|浏览(138)

我试图让git在任何操作中都不改变任何行尾。不幸的是,它似乎不管怎样都不改变行尾。我已经把它简化为下面的测试用例,它有尽可能多的不同机制来禁用这种行为。

  • 从两台计算机开始(Windows计算机= A,Linux计算机= B)
  • 在两台计算机上:第一个月
  • 在两台计算机上: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.txtnew file仍包含CRLF
  • 将B的主文件拉到A:x1米20英寸1x
  • A的document.txt已更改为LF。添加的文件new file也包含LF。

如果B是Windows计算机,则不会出现此问题。

fdbelqdn

fdbelqdn1#

一个简单的解决方案是:

  • 确保core.autocrlf对于 * 所有 * 存储库设置为false:

第一个月

如果转换是自动完成的,则意味着存储库中存在.gitattributescore.eol directive
使用Git 2.8+ (March 2016),检查是否仍存在eol转换:

git ls-files --eol
wj8zmpe1

wj8zmpe12#

在你的项目中,应该有一个.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)。
就像这样:

如果你的项目没有. gitattributes文件,那么行尾是由你的git配置来设置的。要更改你的git配置,可以这样做:
转到此目录中的配置文件:

  1. C:\程序数据\Git\配置
    1.在Notepad ++(或您喜欢的任何文本编辑器)中打开配置文件
    1.将"autocrlf ="更改为假。

对于TortoiseGIT的用户:* 自动CrLf转换 * 设置位于GUI的 * GIT * 部分。

0lvr5msh

0lvr5msh3#

以下是您如何为单个回购协议执行此操作。
在存储库的根目录下创建包含以下行的文件.gitattributes

* -text

就是这样,这是一个匹配所有文件的通配符,告诉git取消设置text属性。这意味着git在进行行尾规范化时,会将所有文件视为非文本文件,并完全禁用它。其他特定于文本的git命令不受影响,只会更改行尾规范化。

57hvy0tb

57hvy0tb4#

我想通了。看起来SCP程序正在转换行尾。当我试图故意制作一个带有LF结尾的文件,然后观察到它在下载时显示为CRLF时,我注意到了这一点。
既然这是我的解决方案,我接受这个答案,但未来的人也应该参考其他答案,找到一个更普遍的解决方案。

w1jd8yoj

w1jd8yoj5#

来自gitattributes(5) Manual Page“效果”主题
第一个月
此属性启用并控制行尾规范化。规范化文本文件后,其行尾将在存储库中转换为LF。要控制工作目录中使用的行尾样式,请对单个文件使用eol属性,对所有文本文件使用core.eol配置变量。
Set
设置路径的text属性可启用行尾规范化并将路径标记为文本文件。行尾转换无需猜测内容类型即可进行。
Unset取消设置路径的text属性会告诉Git在签入或 checkout 时不要尝试任何行尾转换。
未使用新(1.7.2+)Git中的core.autocrlfcore.eol和正确设置|取消文本属性设置被认为是更可靠的方式

ljo96ir5

ljo96ir56#

我试图防止文件在Windows上切换到CRLF行结束,发现当我从GitHub克隆repo时,使用*.md eol=lf将.gitattributes文件添加到存储库中会使我的README.md文件保持LF行结束。
我在git config core.autocrlf false设置或将我的VSCode编辑器设置为使用LF行尾方面没有运气。

相关问题