如何防止 Git/Gitlab 修改 EOL 字符?

Posted

技术标签:

【中文标题】如何防止 Git/Gitlab 修改 EOL 字符?【英文标题】:How to keep Git/Gitlab from modifying EOL character? 【发布时间】:2021-12-25 04:17:28 【问题描述】:

我有一个可以在 Windows 和 Linux 上运行的实用程序。但是,当我通过 Windows 将代码签入 GitLab 时,它会将“cr”添加到 EOL 字符中,使其成为“crlf”。

我尝试将“.gitattributes”添加到存储库分支的根目录,条目如下:

*.sh 二进制文件

*.sh 文本 eol=lf

但是,当我在不同的位置检查分支时,“crlf”仍然存在。

我一直使用这些网址作为参考:

https://docs.github.com/en/get-started/getting-started-with-git/configuring-git-to-handle-line-endings

How do I make Git treat a file as binary?

有什么想法吗?

【问题讨论】:

【参考方案1】:

Git 的推荐方法是使用以下方法:

*.sh text eol=lf

这意味着该文件是一个文本文件,它应该总是使用 LF 字符,这正是你想要的 shell 文件。但是,当您这样做时,您需要执行 git add --renormalize . 然后提交更改和 .gitattributes 文件。否则,如果您已经以 CRLF 结尾签入了文件,则不会发生任何变化。

如果你确实有二进制文件,比如小图像,你可以这样做:

*.jpg binary

但是,如果您在这种情况下这样做,因为存储库已经包含 CRLF 结尾,文件将不会被修改,因此您仍然会以 CRLF 结尾结尾。对于真正的二进制文件,例如图像,这就是您想要的,但对于 shell 脚本,这是不可取的。

请注意,如果您的存储库中有其他文本文件,您也可以这样做:

*.c text

这将启用自动换行符转换,或者如果您只想自动猜测所有剩余的文件类型,您可以这样做:

* text=auto

这将根据文件在前几千字节内是否包含 NUL 字节来猜测文件是文本还是二进制文件。请注意,您仍然需要执行 git add --renormalize . 并同时提交结果更改和 .gitattributes 以使其生效。

如果您在运行git add --renormalize . 并提交后仍然看到本地工作树中的更改,请尝试使用git grep -lP '\r' HEAD:FILE(替换FILE)查看文件在HEAD 的末尾是否有CRLF修订。如果没有,你就做对了。

【讨论】:

这看起来很棒。我会试试的! 问题 - 如果我执行“git add --renormalize.”,这会将目录中的任何新文件添加到提交中吗?如果我只想提交特定文件,我应该摆脱新文件或在“git --add”命令中指定特定文件? 这会将目录中的新文件添加到提交中。但是,您需要在您指定类型的所有文件上调用它,或者您最终会得到始终显示为在git status 中修改的文件。如果愿意,您可以在命令行上专门指定这些文件,而不是 .,但请务必指定所有适当的文件。 我试过了,但还是有问题。 git 不会检查行更改。问题是我事先添加了文件。我已经尝试了很多东西,但仍然没有运气。如何强制它重新归一化? 如果您仍然遇到问题,我会将新文件移开并运行git add --renormalize .。然后你可以使用我刚刚在最后一段中添加的文本来验证你提交的内容是否正确。

以上是关于如何防止 Git/Gitlab 修改 EOL 字符?的主要内容,如果未能解决你的问题,请参考以下文章

Git GitLab配置优化及汉化

使用cat <将字符串写入文件时防止变量替换

gitlab ssh clone设置

编译安装的gitlab8.x如何修改时区设置

如何规范化 Java 中的 EOL 字符?

git gitlab 使用 提交代码解决冲突