必须配置.gitattributes并执行git add --renormalize .,否则git因换行符不一致持续标记文件为modified;goland仅展示git状态,其ide设置对协作无效。

Git 在跨平台协作中把 \r\n 和 \n 当成实质性差异,GoLand 会因此标红所有文件——这不是误报,是 Git 真实检测到了行尾不一致;但问题根源不在 GoLand,而在 Git 的换行符自动转换逻辑和项目配置缺失。
为什么 GoLand 显示 “Contents have differences only in line separators”
这个提示不是 GoLand 自己“觉得”有问题,而是它调用 git status 后读到的 Git 输出。Git 检测到工作区文件(比如刚从 Windows 克隆下来的)换行符是 \r\n,而 Git 缓存(index)里存的是 \n(因为 core.autocrlf=true 在 Windows 上默认启用、在 macOS/Linux 上默认为 input),于是认为“文件被修改了”。GoLand 只是忠实地展示这个状态。
- Mac 或 Linux 用户看到该提示,大概率是因为仓库之前由 Windows 同事提交,且没配
.gitattributes - 即使你本地没改代码,
git diff也会显示整页红色,git status列出所有文件为 modified - 强行
git add -f会把\r\n提交上去,污染仓库,后续其他平台用户会重复踩坑
必须配 .gitattributes,而不是只调 GoLand 设置
GoLand 的 “Line Separators” 选项(Settings → Editor → Code Style → General → Line separator)只影响新创建或粘贴的文件,对已有文件、Git 状态、团队协作零作用。真正起效的是 Git 层级的 .gitattributes 文件。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 在项目根目录新建
.gitattributes,写入:* text=auto eol=lf
- 这条规则让 Git 对所有文本文件自动检测类型,并统一转成
lf存入仓库;检出时按平台策略转换(Windows 转\r\n,macOS/Linux 保持\n) - 如果项目含二进制文件(如
.png、.go以外的构建产物),单独声明:* text=auto eol=lf<br>*.png binary
- 配完后执行:
git add --renormalize .,再git commit—— 这步会重写 index,消除虚假修改标记
GoLand 里要关掉“自动保存时转换换行符”
即使配了 .gitattributes,GoLand 默认可能在保存时按本地系统风格覆盖换行符(比如 macOS 上保存成 \n,但某文件刚被 Git 检出为 \r\n),导致下次打开又触发提示。
- Settings → Editor → General → Strip trailing spaces on Save → 勾选 All lines(可选,但避免空格干扰)
- Settings → Editor → General → Ensure every saved file ends with a line break → 关掉(否则会在末尾强加
\n,破坏原始格式) - Settings → Editor → Code Style → General → Line separator → 改成
Unix and macOS (\n)(统一基准,避免 IDE 自行混用) - 关键:Settings → Version Control → Git → Enable auto-crlf → 必须取消勾选(让 Git 完全接管换行符,IDE 不插手)
验证是否真修复了
别只看 GoLand 是否还标红——那只是 UI 表象。真实验证要看 Git 本身:
- 执行
git status:应该显示nothing to commit, working tree clean - 执行
git ls-files --eol:检查关键文件(如main.go)的i/lf(index 是 lf)、w/crlf(Windows 工作区)或w/lf(macOS/Linux 工作区)是否符合预期 - 在终端用
file main.go看输出是否含CRLF line terminators(Windows)或LF line terminators(macOS/Linux) - 如果仍报错,八成是
.gitattributes没生效,或没运行git add --renormalize .
最易被忽略的一点:团队里只要有一人没配 .gitattributes 或跳过 --renormalize,他下次提交就会把 \r\n 带进仓库,所有人立刻复现问题——换行符治理是仓库级配置,不是个人 IDE 设置能兜底的。










