使 git 以 .git 属性存储带有 CRLF 行结尾的文本文件

Make git store text files with CRLF line endings with .gitattributes

我希望git在内部存储具有 CLRF 行尾样式的文本文件,我不只是想在工作目录中看到这样的行尾(但 WD 也应该包含 CRLF文件)。实现此目的的 .gitattributes 配置是什么?

我需要这个,这样存储库就可以与也在内部使用 CRLF 的 Mercurial 存储库无缝同步(由于原始文件就是这样)。

在检查了我在网上找到的所有可能的配置(包括此处)后,我找不到可以产生 CRLF 的解决方案。这些文件最终以 LF 格式存储。我尝试了以下 .git 属性文件:

* text=
* text eol=crlf

还尝试了 text=auto、text=crlf,甚至没有第一行,也不走运。我也在改变这个之间重新克隆了 repo。

谢谢。

编辑: 在我发布这篇文章 5 秒后,我发现了另一个似乎有效的片段:

*.* -crlf

但是我不确定这到底是做什么的。有人可以确认这就是我想要的它以后不会咬我吗?

你想要的是 Git 原生支持的对立面。 Git 认为换行符是本机内部行结束符,支持不进行过滤,根据文件系统中的文件存储 lf 或 crlf,或者过滤以将文件系统中文件中的 crlf 转换为内部 lf , 和 lf 内部到文件系统上的 crlf。所以 none 的 eol 设置对你有用,因为听起来你想要相反的东西;在内部 crlf,在文件系统上 lf。

Git 也支持任意 "smudge" 和 "clean" 过滤器。 "smudge" 对 "dirties" 文件做一些转换,"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'

edit:为了回应您的编辑,-crlf 只是意味着不会在任何方向上进行 crlf <-> lf 翻译。它不会在您的工作目录中将 lf 转换为内部的 crlf,因此如果您有存储 lf 的编辑器,但需要在内部将数据转换为 crlf,则它无济于事。如果您只是想避免进行任何类型的翻译,那么 * -crlf 应该可以工作,以避免应用任何自动翻译。但是,如果您从未设置过 autocrlf 之类的任何设置(Windows 除外,我认为 autocrlf 是默认设置,则默认情况下不进行任何翻译。