不能直接同步 .ndm 和 .query 文件,因其为跨平台不一致的二进制容器,含路径、编码、字体及元数据差异;应导出为 utf-8 编码的 .xmi(xmi 2.1)或 .sql 文本,配合 .gitattributes 强制 lf 换行与 .gitignore 排除二进制文件,通过「导出→提交→导入」闭环保障模型逻辑等价。

不能直接同步 .ndm 文件,也不能靠 Navicat Cloud 自动拉通 Mac 与 Linux 的查询和模型——跨平台时路径、编码、字体回退、XML 解析行为差异会导致打开失败、字段错位或中文乱码。
为什么 .ndm 和查询收藏夹不能直接 Git 同步
Navicat 16 的 .ndm 是封装 XML 的二进制容器,Mac(基于 Cocoa)和 Linux(基于 Qt)客户端对同一文件的序列化/反序列化结果不一致:即使版本号相同,保存后文件哈希也会变;Git 无法 diff,合并必然冲突。查询脚本(.query)同样不是纯文本,含二进制元数据(如窗口位置、执行历史),Linux 版打开 Mac 导出的 .query 常报 Invalid query file format 或直接忽略内容。
- Mac 上用 Finder 拖拽导出的
.ndm默认带 macOS 文件属性(xattr),Linuxtar解压后可能丢失或误读 - Navicat Cloud 同步依赖本地配置路径,Mac 的
~/Library/Application Support/PremiumSoft/Navicat 16/与 Linux 的~/.navicat/结构不同,云同步仅覆盖“连接”和“代码段”,不包含模型结构或 SQL 查询逻辑 - 查询中若用了 macOS 特有字体(如
.SFNSDisplay)或全角标点,Linux 端渲染会错位甚至截断
正确做法:只同步 UTF-8 文本导出物
放弃同步原始 .ndm 和 .query,改用 Navicat 16 内置导出功能生成可 diff、可版本控制的文本:
- 模型导出为
.xmi(XMI 2.1 标准):File → Export → To XML,必须选XMI 2.1,禁用Include diagram layout(布局信息跨平台不可靠) - 模型导出为
.sql:File → Export → To SQL File,勾选Include Comments和Include Foreign Keys,字符集选UTF-8(不带 BOM) - 查询脚本手动复制为
.sql文本:在查询编辑器中全选 →Ctrl+C→ 粘贴到 VS Code,保存为queries/user_login_check.sql,确保第一行是-- @name: user_login_check注释标记用途 - 所有导出文件统一存于
/models/和/queries/目录下,文件名强制小写、下划线分隔,禁用空格和中文
Git 协作必须加的防护措施
不设防的 Git 仓库在 Mac/Linux 切换时极易损坏模型一致性:
-
.gitattributes中必须声明:* text=auto eol=lf(强制 Unix 换行),否则 Mac 的CRLF提交到 Linux 会触发 Navicat 解析异常 -
.gitignore至少包含:*.ndm、*.query、*.bak、.DS_Store、Thumbs.db、__MACOSX/ - 每次模型变更后,先在 Mac 上导出
.xmi和.sql,再git commit -m "model: update user_auth, add email_index",Linux 端收到后,用File → Import → From XML重新导入.xmi(不是双击打开),避免缓存干扰 - 禁止在任意一端直接点击
Save Model—— 所有变更必须走「导出→提交→另一端导入」闭环
Linux 端导入 XMI 时最常踩的坑
Linux 版 Navicat 16 对 XMI 的解析比 Mac 更严格,稍有不慎就静默失败:
- 导入前先用
file model.xmi确认是XML 1.0 document text,不是data(说明被记事本或 Finder 错误转码过) - 若报
Failed to parse XMI: no valid namespace,用sed -i 's/xmlns=".*"/xmlns="http:\/\/schema.omg.org\/spec\/XMI\/2.1"/' model.xmi修复命名空间(旧版导出有时漏写) - 导入后检查外键线是否全部显示:Linux Qt 渲染引擎对
<extension></extension>块更敏感,若 XMI 中存在未闭合的<dependency></dependency>,关系线会消失但无提示 - 中文注释乱码?用
iconv -f GBK -t UTF-8 model.xmi > model_fixed.xmi转码(仅当确认源是 Windows 编码遗留)
真正麻烦的从来不是“能不能同步”,而是“同步后模型结构是否还等价”。XMI 是唯一能保证逻辑等价的交换格式,但它的脆弱性藏在命名空间、换行符、空格处理这些细节里——别跳过验证步骤,哪怕只是快速扫一眼外键连线是否还在。











