Docker容器中资产文件的行尾

问题描述

我已将git项目复制到Docker容器中。

app/
    .git/
    src/
    .gitattributes

首先,调用git status显示每个已修改的项目文件。这是因为我的项目是在Windows上工作的,并且每个文件都使用CRLF行尾。 我遵循了this guide,并将以下设置添加到了我的.gitattributes文件中。

* text=auto
*.* text eol=crlf

现在,所有源文件均未标记为已修改。但是所有资产文件仍然有效。

modified asset files

如图所示,我所有的源文件都消失了(我正在编辑docker文件,请忽略这些文件)。但是.png,.jpg,.ttf文件仍被标记

解决方法

这里有几件事要注意。首先,当您为text设置*.*属性时,您要让Git将行尾转换应用于与该模式匹配的每个文件(即,每个文件名中带有点的文件)。结果,您要求它对存储库中的每个字体文件和图像执行换行符更改,从而破坏它们,这可能不是您想要的。

最安全的事情是:

* text=auto

它将自动执行行尾转换。

可以强制使用eol=crlf结尾的CRLF行尾,但是如果您的项目在Linux容器中运行,则可能不希望这样做。 Linux内核和Unix Shell不会对回车符进行特殊处理,因此,如果您有任何带有shebang的文件(例如,第一行带有#!)或任何Shell脚本,这些文件将被完全破坏并且无法正常运行如果它们具有CRLF行尾。即使在Windows上的Shell脚本中也是如此。

如果您的编辑器是跨平台的并且具有一定的能力,那么最好改用* text=auto eol=lf来代替LF结尾。如果您要与其他人协作,则只需在存储库中设置* text=auto并运行git config core.eol lf,这不会迫使其他人使用与您相同的行尾。

或者,如果您知道在创建容器之前总是要提交,则可以在容器构建过程中运行git reset --hard,而不必知道或关心哪个之所以使用行尾,是因为您会将所有更改删除并重置为上一次提交。

一旦您修复了.gitattributes文件并提交了该文件(并且仅提交了该文件),则可以运行git reset --hard来重置工作树并删除所有更改,这将使树返回到干净的状态。

我将指出,一般而言,跨系统共享存储库可能很棘手。 Git的索引保留了工作树中每个文件的元数据,因此,当您更改操作系统时,下次使用git status时,必须强制重新读取树中的每个文件。某些功能(例如替代功能)也会将路径名写入到存储库中,而这些路径名根本无法跨系统移植,因此请注意不要使用这些功能。