如何在 Windows/Linux/Mac 操作系统上的 Git 中处理行尾字符?
这个问题也可以重新表述为 - 如何解决 Git 警告 - “LF 将被 CRLF 替换”?
行尾使用两个特殊字符“\r
" 在 Windows 操作系统中标记,而“
" 字符用于在 MacOS 和 Linux 系统中标记行尾。
\r 和
分别被称为 **回车 (CR)** 和 **换行 (LF)** 字符。正确处理行尾字符对于跨多个操作系统的保持一致性非常重要。
行尾字符可以通过两种方式配置 -
**安装时** -
在安装过程中,Git 允许我们从以下选项中选择以配置行尾转换,如上所示 -
**检出 Windows 样式,提交 Unix 样式行尾** - **CRLF** 将在检出和提交操作中转换为 **LF**。当 Git 安装在 Windows 上并且项目协作者使用非 Windows 机器时,这是推荐的设置。
**按原样检出,提交 Unix 样式行尾** - 检出时不执行任何转换。但是,当提交文件时,Git 会将 CRLF 转换为 LF。当 Git 安装在 Unix 样式机器上并且项目协作者使用 Windows 机器时,这是推荐的设置。
**按原样检出,按原样提交** - 在检出或提交文件时不执行任何转换。当 Git 安装的操作系统和协作者机器的操作系统相同时,建议使用此选项。
安装后 - 配置 autocrlf 属性
**"core.autocrlf"** 属性应配置为管理行尾转换。考虑以下场景
场景 1 - Git 安装在 Windows 机器上,协作者在不同的平台上工作
A 先生和 B 先生正在同一个项目上工作。A 先生使用 Windows 机器,B 先生使用 Mac 机器。如前所述,Windows 和 Mac 操作系统使用不同的字符来标记行尾。这意味着,如果 A 先生将代码检入存储库,Git 应该从行尾删除回车符 (**\r**)。同样,当他从存储库检出代码时,Git 应该更新行尾并添加回车符。
在 Windows 操作系统上,可以通过使用以下命令将 "**core.autocrlf**" 设置为 true 来实现:
$ git config --global core.autocrlf true
现在让我们创建一个文件,将其添加到暂存区并观察输出。
$ echo hello >abc.txt $ git add abc.txt
Git 将显示一条消息,指出 LF 将在文件“abc.txt”中被 **CRLF** 替换。如下所示 -
Warning: LF will be replaced by CRLF in abc.txt. The file will have its original line endings in your working directory
场景 2 - Git 安装在 Unix 或 Mac 机器上,协作者在不同的平台上工作
现在让我们考虑一个场景,其中使用 MacOS 机器工作的 B 先生尝试检出代码。如果代码正在检出到 Mac 或 Linux 机器,Git 不应该修改行尾字符。但是,有时,代码编辑器或 IDE 可能会意外添加回车符。在这种情况下,Git 应该足够智能地识别操作系统并在将其添加到存储库之前删除回车符。可以通过在配置文件中设置以下行来设置 Mac 或 Linux 系统上的此行为:
$ git config --global core.autocrlf input
这意味着,Git 应该只在代码存储在存储库中时修改代码。
现在让我们创建一个文件,将其添加到暂存区并观察输出。
$ echo hello > abc.txt $ git add abc.txt
输出将是 -
Warning − LF will be replaced by CRLF in abc.txt. The file will have its original line endings in your working directory
现在让我们尝试观察如果在禁用 core.autocrlf 设置后添加文件,Git 的行为。可以使用以下命令禁用此设置。
$ git config --global core.autocrlf false
现在让我们创建一个文件,将其添加到暂存区并观察输出
$ echo hello > abc.txt $ git add abc.txt
现在 Git 没有显示任何警告消息,因为 **autocrlf** 设置为 **false**。如果项目由使用不同平台的协作者开发,则不应使用此设置。
dell@DESKTOP−N961NRS VINGW64 /e/tut_repo (master) $ echo hello > def. txt dell@DESKTOP−N961NR5 MINGW64 /e/tut_repo (master) $ git add def.txt