文章

换行符差异 - Windows 和 Linux EOL 检查和 Git Repo 同步

如果您需要在 Linux 和 Windows 上修改并提交同一个 Git 存储库中的文件,则可能会出现这样的情况:Git 客户端在 Git 提交阶段将该文件识别为已修改文件,即使该文件的内容显然没有被修改。

问题的原因在于,虽然文件内容相同,但 Windows 和 Linux 中表达换行符的基本方式不同。下图中,左边是在Windows(PC)下修改并保存的文件,右边是在Linux(UNIX)下修改并保存的文件。

文件内容相同但文件不同,左边是Windows PC格式,右边是Linux UNIX格式 文件内容相同但文件不同,左边是Windows PC格式,右边是Linux UNIX格式

Windows和Linux换行符的区别

从 ASCII 字符的角度来看,

Windows 以CRLF(回车换行)的形式表示换行符,如下所示。

1
\r\n

在 Ubuntu 等 Linux 系统中,换行符仅表示为LF(换行),如下所示。

1
\n

假设您从 Git 收到一个以 LF 格式表示换行符的文件,在 Windows 编辑器中对其进行了简短修改,然后将其恢复。这意味着该文件表面上内容相同,但换行符被CRLF修改,因此有可能会转化为与Git中的文件不同的文件。

如果你在Linux上运行在Windows上编写的bash脚本,你可能会在调试过程中遇到神秘的脚本执行错误。这可能是因为 shell 脚本在 Windows 上以 CRLF 格式存储换行符,而 bash 无法解释这一点。

检查并转换文件的 EOL(行尾)

当然,即使您在Windows中编写文件,您也可以创建并转换UNIX(LF)格式的文件,而不是PC(CRLF)格式。相反的情况也是可能的。该转换操作通常称为EOL(行尾)转换

事实上,当您第一次遇到每个操作系统的 EOL 差异时,可能会有点困惑。因此,与以后要解释的内容相关的关键词可以映射到如下所示的表格中。

姓名视窗乌班图(Linux)
换行符格式术语CRLF(回车换行)LF(换行)
换行符表示字符\r\n\n
来自 Ubuntu 中file工具的信息ASCII text, with CRLF line terminatorsASCII text
Beyond Compare 工具中的 EOL 类型PCUNIX
Ubuntu 中的 EOL 类型dosunix
Ubuntu 上的 EOL 转换工具unix2dosdos2unix

视窗

使用 Notepad++ 编辑器可以帮助您创建 EOL 的文件。

如下图所示,您可以在Notepad++编辑器中查看当前EOL Conversion状态并进行转换。菜单位于编辑 > EOL 转换

Notepad++ - EOL 转换 - `编辑 > EOL 转换 > Windows (CR LF) 或 Unix (LF)` Notepad++ - EOL 转换 - 编辑 > EOL 转换 > Windows (CR LF) 或 Unix (LF)

乌班图(Linux)

在Ubuntu环境中,您还可以检查文件的EOL状态并进行转换。

您可以使用file工具检查文件的 EOL 状态。

1
2
3
4
5
6
7
# PC (CRLF)
$ file pc.txt 
pc.txt: ASCII text, with CRLF line terminators

# Unix (LF)
$ file unix.txt 
unix.txt: ASCII text

对于文件的 EOL 转换,必须安装 tofrodosdos2unix。可以使用apt安装它。

1
2
sudo apt-get install tofrodos
sudo apt-get install dos2unix

安装软件包后,您可以使用以下工具。

  • dos2unix : 将 PC (CRLF) 转换为 Unix (LF)
  • unix2dos : 将 Unix (LF) 转换为 PC (CRLF)

下面是将 PC (CRLF) 转换为 UNIX (LF) 的示例。

1
2
3
4
5
6
7
8
9
$ file pc.txt 
pc.txt: ASCII text, with CRLF line terminators

$ dos2unix pc.txt 
dos2unix: converting file pc.txt to Unix format...

$ file pc.txt 
pc.txt: ASCII text

操作系统之间的 Git 存储库 EOL 同步

Git 存储库中有一项 Git 设置,可防止在 Windows 和 Ubuntu 环境中提交和拉取文件时出现 EOL 转换问题。

下面的 git 命令在将 ASCII 格式文件插入对象数据库之前将 CRLF 更改为 LF。所以主要用于Windows环境下的Git设置。

1
git config --global core.autocrlf input 

下面的 git 命令使用换行符作为 LF。所以主要用于Ubuntu(Linux)环境。

1
git config --global core.autocrlf true

由于上述命令是全局 Git 设置,因此如果您希望 EOL 设置仅应用于特定的克隆存储库,则可以进入相关存储库文件夹并使用仅删除--global选项的命令。

换句话说,目的是将带有 LF 格式的 EOL 的文件上传到 Git 服务器。

在Windows环境下,右键单击菜单即可访问Git Bash。

在 Windows 上访问 Git Bash 在 Windows 上访问 Git Bash

本文由作者按照 CC BY 4.0 进行授权