让git使用.gitattributes将文本文件存储为CRLF行尾

4
我希望git在内部存储文本文件时使用CLRF行尾格式。我不仅想在工作目录中看到此类行尾(但WD也应包含CRLF文件)。哪种.gitattributes配置可以实现这一点? 我需要这样做,以便存储库可以与使用CRLF的Mercurial存储库无缝同步(由于原始文件是这样的)。在查阅了包括此处在内的所有可能的配置后,我无法找到产生CRLF的解决方案。最终,这些文件以LF形式存储。我尝试了以下.gitattributes文件:
* text=
* text eol=crlf

我也尝试了text=auto、text=crlf以及去掉第一行,但都没有成功。我在修改后也重新克隆了该存储库。

谢谢。

编辑:就在我发布这篇文章的5秒钟后,我发现另一个代码片段似乎可以正常工作:

*.* -crlf

然而我不确定这到底是做什么的。有人能确认一下吗?这不会在以后对我造成影响吧?

1个回答

6
您希望的是Git本身不支持的相反功能。Git认为换行符是本地内部的行尾标识,可以支持不进行任何过滤,因此根据文件系统中的文件使用lf或crlf进行存储;或者进行过滤以将文件系统中的crlf转换为内部的lf,并将内部的lf转换为文件系统中的crlf。因此,由于您似乎想要相反的操作,即在内部使用crlf,而在文件系统中使用lf,所以以上所有的eol设置都无法满足您的需求。
Git还支持任意的“smudge”和“clean”过滤器。“smudge”会对文件进行一些转换,使其变“脏”,而“clean”应该进行相反的转换以清理它并提交。
要实现这个功能,请将以下内容添加到您的 .git/config 文件中:
[filter "dosify"]
        clean = unix2dos
        smudge = dos2unix

然后在你的.gitattributes文件中:

* filter=dosify

如果您没有安装dos2unix/unix2dos,您可以使用以下命令:

[filter "dosify"]
        clean = tr '\\n' '\\r\\n'
        smudge = tr '\\r\\n' '\\n'
编辑: 为了回应您的编辑,-crlf 意味着不会在任何方向上进行 crlf <-> lf 的转换。它不会将您工作目录中的 lf 转换为 crlf,因此如果您有存储 lf 的编辑器,但需要数据在内部变成 crlf,它就无法帮助实现。如果您只想避免进行任何翻译,则只需使用 * -crlf,以避免应用任何自动翻译。但是,如果您从未设置过任何像 autocrlf 这样的设置(除了 Windows,在那里我认为 autocrlf 是默认设置),则不进行任何翻译是默认设置。

感谢您提供详细的回答。正如我所提到的,我希望在 WD 中也可以看到 CRLF(或系统原生),但无论如何都要存储 CRLF。但是您所描述的也涵盖了这一点。我还没有说过,理想情况下,这个配置应该随着 repo 一起使用。请问我是否正确理解您的建议不是完全可以从 .gitattributes(第二个版本)进行配置的?是的,在 Windows 上,由于默认情况下 autocrlf 为 true,因此 git 会在内部转换为 LF。 - Piedone
@Piedone 是的,没错;你必须设置你的.git/config来定义过滤器,而这并不会随仓库一起被推送或拉取,你需要在每个想要使用它的仓库中设置它。 - Brian Campbell
感谢您的解释。 - Piedone

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