Vibe Tutorial
Git 版本控制与跨平台协作

10.4 跨平台协作问题

Tip

看不见的字符,往往是最致命的杀手。


1. 为什么要学这个?

你在 Windows 上写了一个自动部署脚本 deploy.sh。 本地运行一切正常。 你把它推送到 Linux 服务器上运行。 报错bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory 你甚至根本看不出代码哪里错了。 凶手是不可见的换行符。Windows 和 Mac/Linux 对"换行"这件事有着跨越半个世纪的误解。


2. 核心概念:CRLF vs LF

打字机的遗产

计算机早期的设计模仿了打字机:

  • CR (Carriage Return, \r): 将打印头移回行首(回车)。
  • LF (Line Feed, \n): 将纸张往上卷一行(换行)。
  • Windows: 坚持复古,用 CRLF (\r\n) 代表换行。
  • Mac/Linux: 觉得浪费空间,只用 LF (\n) 代表换行。

冲突点:如果不加干涉,Windows 用户提交的代码全是 CRLF,Mac 用户拉下来就会乱码或报错。


3. 解决方案 (HOW)

我们无法改变操作系统,但我们可以强制 Git 遵守规矩。 最佳实践:在项目根目录新建一个 .gitattributes 文件。 这个文件告诉 Git:"不管你在哪个系统上写代码,提交到仓库时,必须把换行符统一转成 LF。"

1. 创建 .gitattributes

在项目根目录下新建文件 .gitattributes,写入:

# 强制所有文本文件在仓库里存为 LF
* text=auto eol=lf

这一行配置,胜过一万句口头约定。

2. 统一文件名大小写

  • Windows: Login.tsxlogin.tsx 是同一个文件。
  • Linux: 它们是两个完全不同的文件。

避坑

  1. 全小写 (kebab-case): 文件名一律用小写,如 user-profile.tsx
  2. Git 敏感设置: git config core.ignorecase false

4. 真实案例

Story

那个瘫痪的 Shell 脚本

某公司的运维工程师在 Windows 电脑上编写了一个数据库备份脚本 backup.sh。 他推送到 GitLab。 晚上 12 点,Linux 服务器定时任务执行该脚本——失败。 报错提示 command not found,但命令明明是对的。 原因: 脚本变成了 backup.sh\r。Linux 试图去寻找一个叫 bash\r 的解释器,当然找不到。 是那个看不见的 \r (CR) 毁了一切。

Vibe 心法: 真正的跨平台协作,不是让每个人都用 Mac,而是建立一套无视平台差异的规则.gitattributes 就是这套规则的法律文本。


5. 本章小结

  1. 标准化:仓库里只存 LF。
  2. 自动化:用 .gitattributes 自动转换,别依赖开发者自觉。
  3. 敏感性:永远假设文件名是区分大小写的(因为生产环境 Linux 区分)。