Skip to content

feat: support upgrade with local customizations (dirty repo) #25

Description

@librae8226

问题描述

用户对 Nexus 做了本地定制(修改源码文件如 toolbarDefaults.tsserver.js 等),导致 git status --porcelain 非空。检查更新时系统检测到 dirty 状态,只显示警告,无法继续升级。

截图示意:

"本地有未提交的修改,请先处理后再升级。"

用户无法在保留自定义的同时跟随上游版本升级。


根本原因

/api/version 返回 clean: false 后,前端 dirty 状态只显示警告文字,没有提供任何可操作的升级路径。

当前升级命令:

git pull && cd frontend && npm run build && cd .. && pm2 restart nexus

不处理 dirty 状态,直接 git pull 遇到本地修改会报错或中止。


用户分类

类型 例子 是否会 dirty
配置文件修改 .env, data/ 否(已 gitignore)
源码定制 toolbarDefaults.ts, server.js
意外文件 手动创建的脚本 是(untracked)

方案

短期(改善升级体验)

1. 升级命令改用 --autostash

git pull --rebase --autostash && cd frontend && npm run build && cd .. && pm2 restart nexus

--autostash 会自动 stash 本地修改 → pull & rebase → 自动 pop stash,适用于本地修改与上游改动文件不重叠的场景(大多数定制用户)。

2. Backend:返回 dirty 文件列表

/api/version 额外返回 dirtyFiles: string[],让前端展示具体哪些文件被修改。

3. Frontend:dirty 状态提供可操作选项

  • 展示哪些文件被修改(让用户清楚 stash 的内容)
  • 提供两个可复制的命令:
    • 智能升级(推荐):autostash 方案,本地修改会被保留并尝试重新应用
    • 强制升级git checkout . && git pull && ...,丢弃本地修改(加危险警告)

长期(架构支持定制)

将用户常见的定制点迁移到 gitignore 的配置文件(如 data/custom/toolbar-overrides.json),用户无需修改源码即可定制,从根源消除 dirty 问题。


受影响版本

v4.3.x / v4.4.x(用户反馈于 v4.3.12 → v4.4.5 升级时触发)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions