Git 中的 Windows 与 Linux 的换行符兼容问题

前置知识

众所周知,在不同的操作系统中,行结束符的表示方式是不同的:

  • 在 Unix、Linux 和类 Unix 系统中(如 macOS),行结束符用换行符(LF)表示。
  • 在早期的 Mac OS(9 及以前)中,行结束符用回车符(CR)表示。
  • 在 Windows 系统中,行结束符用回车符(CR)后跟换行符(LF)的组合表示。

因此,Windows 系统中的文本文件中每行的结尾都是由 CRLF 组成的(即回车换行)

在某些情况下,当在 Unix 或 Linux 系统中处理 Windows 风格的文本文件时,CRLF 换行符可能会引发问题,例如在运行脚本或解析文件时。在这些情况下,需要进行换行符的转换,将 CRLF 转换为 LF,以使其与 Unix 系统兼容。

可以使用一些工具或命令来进行换行符转换,例如 dos2unixsed 命令。这些工具可以将 Windows 风格的 CRLF 换行符转换为 Unix 风格的 LF 换行符。

问题分析

这天我在准备使用 Docker 配置 buildroot 时,发现使用 -v 参数挂载宿主机的目录或文件到容器内部,然后进到容器里编译会提示 No such file or directory 的经典报错,稍微分析了一下,应该是行结束符的问题,因为我是在 Windows 上先克隆仓库,然后再把本地仓库映射到容器内。这样克隆下来的文件的行结束符都是 Windows 风格的 CRLF,再进到容器内使用编译命令的时候,是在 Linux 下执行的,所以会导致兼容性问题。

解决方案

解决办法也很简单,只要使用 Linux 系统克隆下来仓库就好了,我这里使用的是 WSL 克隆到 Windows 文件系统内,然后再创建容器映射文件夹就没问题了。当然也可以使用 Docker 建一个 Linux 容器,然后把仓库克隆下来再导出到 Windows 文件系统下。

总结

Docker 还是在 Linux 下使用更好,Windows 下的 Docker Desktop 还有比较多的问题。