【发布时间】:2013-10-09 02:17:13
【问题描述】:
有时人们在提交代码时无意中改变了 eol 样式。如何让 git 阻止他们这样做?我搜索了这个主题,发现大多数答案都集中在如何将文件转换为特定的 eol 样式。但我不想要这种行为。我只希望提交者遵守原始文件的 eol 样式,\n 或 \r\n。 git能做到吗?
【问题讨论】:
有时人们在提交代码时无意中改变了 eol 样式。如何让 git 阻止他们这样做?我搜索了这个主题,发现大多数答案都集中在如何将文件转换为特定的 eol 样式。但我不想要这种行为。我只希望提交者遵守原始文件的 eol 样式,\n 或 \r\n。 git能做到吗?
【问题讨论】:
我只需要强制提交者遵守作者选择的原始 eol 样式。也就是说,既不允许将\n 转换为\r\n,也不允许将\r\n 转换为\n。但我不在乎原来的eol风格是什么
如果你有core.autocrlf set to false,git 不会在任何时候尝试转换任何东西。
但这也意味着用户编辑器可以在 Git 不知情的情况下更改 eol:Git 在结账时不会记住 eol。
这意味着它将检查用户已修改的任何内容(包括 eol 更改)。
你可以试试post-checkout hook,它会负责为你记住这些信息,但这似乎有点矫枉过正。
我更喜欢在 .gitattributes 文件中为某些类型的文件注册规范化,如本答案的下一部分所示。
原始答案,说明 Git 在提交时可以强制执行:
您可以在.gitattributes files 中注册您想要的eol(针对特定类型的文件),使用eol 指令:
text
此属性启用和控制行尾标准化。
当一个文本文件被规范化时,它的行尾在存储库中被转换为 LF。
要控制工作目录中使用的行尾样式,对单个文件使用eol属性,对所有文本文件使用core.eol配置变量。
eol
此属性设置要在工作目录中使用的特定行尾样式。
它可以在没有任何内容检查的情况下启用行尾规范化,从而有效地设置文本属性。设置为字符串值“
crlf”此设置强制 Git 在签入时规范化此文件的行尾,并在签出文件时将其转换为
CRLF。设置为字符串值“
lf”此设置强制 Git 在签入时将行尾规范化为
LF,并在文件签出时阻止转换为CRLF。
例如:
*.sh eol=lf
在.gitattributes 文件中注册这些指令的意义在于它将在存储库克隆中保持不变。
【讨论】: