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
。某些功能,例如替代品,也会将路径名写入存储库,这根本无法跨系统移植,因此您需要注意不要使用这些功能。
我已将 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.
如果您的编辑器是 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
。某些功能,例如替代品,也会将路径名写入存储库,这根本无法跨系统移植,因此您需要注意不要使用这些功能。