换行符差异 - Windows 和 Linux EOL 检查和 Git Repo 同步
如果您需要在 Linux 和 Windows 上修改并提交同一个 Git 存储库中的文件,则可能会出现这样的情况:Git 客户端在 Git 提交阶段将该文件识别为已修改文件,即使该文件的内容显然没有被修改。
问题的原因在于,虽然文件内容相同,但 Windows 和 Linux 中表达换行符的基本方式不同。下图中,左边是在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 terminators | ASCII text |
Beyond Compare 工具中的 EOL 类型 | PC | UNIX |
Ubuntu 中的 EOL 类型 | dos | unix |
Ubuntu 上的 EOL 转换工具 | unix2dos | dos2unix |
视窗
使用 Notepad++ 编辑器可以帮助您创建 EOL 的文件。
如下图所示,您可以在Notepad++编辑器中查看当前EOL Conversion
状态并进行转换。菜单位于编辑 > EOL 转换
。
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 转换,必须安装 tofrodos
和 dos2unix
。可以使用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。