问题描述 链接到标题

前面提到,我会使用 Filen 来同步文件,例如当我在 macOS 上创建了 .md 文件而忘记 push 到 GitHub 时,回到宿舍,打开我 Windows 系统的 Acer 笔记本(后续以 Acer 指代该笔记本)时,Filen 会自动将 .md 文件同步到 Acer,然后当我在 Acer 上完成对该 .md 的编辑并 commit 时,就会提示如下内容:

CR 表示 \r,LF 表示 \n

warning: LF will be replaced by CRLF in content/posts/blog/n1-plex-music.zh.md.
The file will have its original line endings in your working directory

我们在安装 Git 时,默认 core.autocrlf = true,即 Git 会认为,工作区的文件都应该用 \r\n 来换行,如果工作区因为新增(在这个情境下就是因为 Filen 把文件同步到了 Acer)或编辑出现了 \n 换行符的文件,git add 这些文件时,发现准备提交的文件是 \n 作为换行符,就会出现这个警告,并提示哪些文件是 \n 换行的,但是 Git 不会对工作区这些文件做换行符的转换)。

工作区(Working Directory):这是您本地文件系统中的目录,包含了项目的实际文件。您可以在工作区中进行文件的创建、编辑和删除操作。

暂存区(Staging Area):也称为索引,是一个中间区域,用于准备要提交到Git存储库的更改。您可以使用 git add 命令将工作区中的文件和更改添加到暂存区,然后使用git commit命令将它们提交到存储库。

存储库(Repository):存储库是Git用来保存项目的历史记录和元数据的地方。它包含了所有以前提交的版本、分支信息、标签和提交记录。存储库通常位于项目目录的.git子目录中。

core.autocrlf = true 表示在 commit 时,将工作区文件的换行符由 \r\n 转换为 \n,即 Repository 的文件一定是 \n 换行的,而在 checkout 或者 pull 时,会将 checkout 或者 pull 到本地的文件转换为 \r\n 换行,这就是 解决 macOS 上的 fish 出现的 ’et_color Unkown color ’ 问题 这篇文章碰到的问题的根本原因。

我先执行了 git pull,将 macOS 上对 .config 目录的修改同步到了本地,由于 fish_variables 在 macOS 上可能发生了修改,于是 pull 的时候,Windows 中的 ~/.config/fish/fish_variables 在从 Github pull 到本地时,换行符就被从 \n 转换成了 \r\n,然后 \r\n 换行同步的文件就被 Filen 同步到了 macOS 上去了,macOS 上 fish 就无法正确识别 fish_variables 中定义的变量,就出现了 ’et_color Unkown color ’ 问题。

解决方案 链接到标题

首先,执行 git config --global core.autocrlf input,表示在 commit 时,将 \r\n 自动转换成 \n,而 pull 或者 checkout 时,不转换 \r\n 或者 \n,保持原样。

然后,我们需要修改 VsCode、NeoVim、Sublime Text 这三个编辑器的设置,让它们即使在 Windows 下也以 \n 作为换行。

对 VsCode,设置中搜索 eol,修改为 \n;对于 Sublime Text,修改 View -> Line EndingsUnix;对于 Neovim,在 nvim/lua/config/options.lua 中追加 vim.opt.fileformat = 'unix'

我平时会用到的编辑器就是以上三个。

这个解决方案比较暴力,就是保证不管是 Windows 还是 macOS 都使用 \n 来进行换行。