Docker 容器中资产文件的行尾

Line ending for asset files in Docker container

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

app/
    .git/
    src/
    .gitattributes

起初,调用 git status 显示每个项目文件都已修改。这是因为我的项目是在 Windows 上工作的,并且每个文件都使用 CRLF 行结尾。 我按照 this guide 并将以下设置添加到我的 .git 属性文件中。

* text=auto
*.* text eol=crlf

现在 none 的源文件被标记为已修改。但所有资产文件仍然如此。

如图所示,我所有的源文件都不见了(我正在编辑docker文件,所以请忽略那些)。但是.png,.jpg,.ttf文件还是有标记的

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

更安全的做法是:

* text=auto

自动执行行尾转换。

可以 强制使用带有 eol=crlf 的 CRLF 行结尾,但是如果您的项目 运行 在 Linux 容器中,你可能不想。 Linux 内核和 Unix shells 不特别对待回车符 returns,所以如果你有任何带有 shebang 的文件(例如,第一行带有 #!)或者任何 shell 脚本,如果它们有 CRLF 行结尾,这些脚本将完全损坏并且无法运行。即使 Windows.

上的 shell 脚本也是如此

如果您的编辑器是 cross-platform 并且相当有能力,您最好强制使用 * text=auto eol=lf 的 LF 结尾。如果您要与其他人协作,则只需在您的存储库中设置 * text=auto 和 运行 git config core.eol lf,这不会强制其他人使用与您相同的行尾。

或者,如果您知道在创建容器之前总是要提交,则可以 运行 git reset --hard 作为容器构建过程的一部分,然后您不需要必须知道或关心使用了哪些行结尾,因为您将放弃所有更改并重置为上次提交。

修复 .gitattributes 文件并提交(并且仅提交)后,您可以重置工作树并通过 运行ning git reset --hard 取消所有更改,这应该 return 你的树到一个干净的状态。

我要指出的是,一般来说,跨系统共享存储库可能很棘手。 Git 的索引保留有关工作树中每个文件的元数据,因此当您更改操作系统时,您必须在下次使用时强制对树中的每个文件执行 re-read git status。某些功能,例如替代品,也会将路径名写入存储库,这根本无法跨系统移植,因此您需要注意不要使用这些功能。