先说一个核心结论:千万别拿 .ndm 文件直接往 Git 里扔,尤其是在 Windows 和 Linux 之间来回折腾。它本质上就是个二进制黑箱,不同版本的 Na vicat(特别是跨平台)生成的结构压根不对齐。Git 没法做 diff,合并时冲突是板上钉钉的事,恢复成功的概率低得可怜——这不是技术问题,是设计上的硬伤。

常见翻车现场:从 Windows 导出的 .ndm,用 git checkout 拉到 Linux 版 Na vicat 里,要么弹窗报 "Invalid model file format",要么直接闪退;偶尔能打开,字段顺序却乱成一团,关系线凭空消失。背后的原因其实很明确——
- Na vicat 官方文档白纸黑字写着
.ndm是“内部格式”,从没承诺过跨平台或跨版本兼容。 - Linux 版 Na vicat 基于 Qt 构建,对 Windows 那边生成的元数据编码(比如路径分隔符、换行符、BOM)异常敏感,稍有偏差就罢工。
- 就算两边的 Na vicat 是同一个版本,Windows 保存的
.ndm在 Linux 上打开再保存一次,文件哈希值也会变——Git 会误以为文件被修改过,平添一堆无意义的提交记录。
替代方案:导出为可 diff 的文本格式再 Git 管理
既然二进制路走不通,那就转向 Na vicat Data Modeler 内置的导出功能,生成标准文本文件,这才是 Win/Linux 双端协同的正确姿势。
- 导出路径:菜单栏
File → Export → To SQL File,选择对应的 DBMS(MySQL、PostgreSQL 等),务必勾选Include CREATE TABLE、Include Foreign Keys、Include Comments。 - 同时再导一份
File → Export → To XML (XMI),选XMI 2.1标准——这是目前唯一能被 Git 友好支持的模型交换格式,实体、属性、关系的层级结构一目了然。 - SQL 文件用于物理验证,拿到就能直接导入本地数据库跑一遍;XMI 文件用于逻辑比对,
git diff能清晰看出谁删了哪个字段、改了哪个关系。 - 所有导出文件统一用 UTF-8 编码保存,并且禁用 BOM。默认导出是无 BOM 的,但有些编辑器会偷偷加上,一旦出现,Linux 端就可能出问题。
Git 仓库结构与协作规范
跨平台模型协同失败的另一个常见原因是仓库结构混乱。必须约定根目录下的固定子路径,否则 Windows 和 Linux 在路径大小写、分隔符上的差异会直接破坏引用。
- 根目录放一个
VERSION文件(纯文本,内容如v1.2.0-20260422),每次模型变更后更新并绑定git tag。 - 模型文件全部存于
/models/下,强制小写命名:user_auth.xmi、user_auth.sql,禁用空格和中文。 .gitignore必须包含:*.ndm、*.bak、Thumbs.db、.DS_Store(Linux 拉取 Windows 提交时很可能带进来)。- 禁止直接在 Na vicat 里“保存模型”——所有变更必须走“导出 → 提交 → 同步 → 重新导入”这个闭环,一步都不能省。
Linux 端导入 XMI/SQL 的实操要点
Linux 版 Na vicat 对导入路径和权限要求更苛刻,最容易卡在第一步。
- 导入 XMI:菜单
File → Import → From XML (XMI),记得点开Advanced Options,勾选Overwrite existing objects,否则只追加不覆盖,多次导入后模型里会出现一堆重复对象。 - 导入 SQL:右键目标连接 →
Execute SQL File,编码务必手动选UTF-8。Linux 默认可能是ISO-8859-1,用这个编码导入 UTF-8 的 SQL,注释乱码、建表失败几乎是必然的。 - 如果 SQL 导入时报
"Unknown character set: 'utf8mb4'",说明导出时用了 MySQL 8.0+ 的特性,而你的本地 MySQL 是 5.7。解决方案:在导出向导中取消勾选Use utf8mb4,或者手动替换 SQL 中所有utf8mb4为utf8。 - 导入后务必跑一遍
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db';核对表数量。外键顺序问题很容易导致部分表建不出来,但 Na vicat 不会报错。
还有一个极容易被忽略的细节:Na vicat Linux 版不读取 Windows 用户目录下的配置缓存,每次导入 XMI 后,必须手动点击 Model → Validate Model 才能刷新关系图。不点这一步,ER 图里所有连线都会消失——但底层 SQL 其实已经生效了。别再被这个假象误导了。
