如何让git拒绝任何行尾符样式的更改?

3

有时人们在提交代码时会无意中更改行尾样式。如何让Git阻止他们这样做?我搜索了这个话题并发现大多数答案都集中在如何将文件转换为特定的行尾样式上。但我不想要这种行为。我只想让提交者遵守原始文件的行尾样式,无论是 \n 还是 \r\n。Git能做到吗?

1个回答

2
我只需要强制提交者遵守作者选择的原始行尾样式。也就是说,不允许将\n转换为\r\n,也不允许将\r\n转换为\n。但是我不关心原始行尾样式是什么。
如果您将core.autocrlf设置为false,Git不会尝试在任何时候转换任何内容。
但这也意味着用户编辑器可以更改eol而Git对此一无所知:Git不会在检出期间记忆eol。这意味着它将检入用户进行的任何修改(包括eol更改)。
你可以尝试使用一个post-checkout hook来负责为你记忆这些信息,但那似乎有点过头了。我更喜欢在.gitattributes文件中为某些类型的文件注册规范化,如本答案的下一部分所示。
原始答案,说明 Git 在提交时可以强制执行什么:

您可以在 .gitattributes 文件 中注册您想要的行尾符(针对特定类型的文件),并使用行尾指令:

text

这个属性启用并控制行尾规范化。当一个文本文件被规范化后,其行末将在仓库中转换为 LF。要控制工作目录中使用的行结束符样式,请使用单个文件的 eol 属性和所有文本文件的 core.eol 配置变量。
eol

该属性设置了在工作目录中使用的特定行尾样式。它使得行尾规范化不需要任何内容检查,从而有效地设置文本属性。
设置为字符串值“crlf”,此设置强制Git在签入时对该文件进行行尾规范化,并在检出时将其转换为CRLF。
设置为字符串值“lf”,此设置强制Git在签入时将行尾规范化为LF,并防止在检出时将其转换为CRLF。
例如:
*.sh        eol=lf

.gitattributes文件中注册这些指令的好处是,它将跨存储库克隆保持持久性

谢谢。但我不想进行任何规范化。我只需要强制提交者遵守作者选择的原始行尾样式。也就是说,不允许将 \n 转换为 \r\n,也不允许将 \r\n 转换为 \n。但我不关心原始行尾样式是什么。 - Alvin Cao
@AlvinCao Git在提交者最初开始修改文件时不会记录文件中使用的eol,它只能在提交时强制执行一种样式,而这种样式不能是“在检出时使用的任何样式”,因为Git从未在任何地方记忆过这个特定的信息。 - VonC
@AlvinCao 我已经根据你的评论编辑了我的答案。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接