Skip to content

[feat] Feature: 支持将当前工作区所有笔记一键同步到远程 Git 仓库 #799

@xianggau

Description

@xianggau

描述你的建议

功能需求概述

当前 NoteGen 在使用 Git / Gitea 等作为同步后端时,文章(Markdown)同步是以单篇为粒度的:

  • 需要在文章底部点击同步按钮,或者
  • 依赖自动同步在编辑后逐篇上传

对于已经存在于本地工作区里的大量 Markdown 文件,想要「第一次全部上传到远程同步仓库」时,需要一篇一篇手动触发同步,操作成本比较高。

希望增加一个「一键上传当前工作区所有笔记到远程 Git 仓库」的功能,用于首次迁移 / 批量补齐远程数据。


当前行为(Current Behavior)

以 Gitea 为例(其他 Git 平台逻辑类似):

  • 已设置工作区目录后,NoteGen 能正确显示该目录下的 Markdown 文件列表。
  • 已在设置中配置:
    • primaryBackupMethod = gitea
    • Gitea 实例地址、Access Token、自定义同步仓库名等,并通过了仓库检测。
  • 使用 NoteGen 的同步功能时:
    • 标题栏的「上传全部」可以一次性上传:
      • 标签(.data/tags.json
      • 记录 / 聊天数据
      • 配置(.settings/store.json.data/settings.json
    • 但文章正文的同步逻辑在 core/article/custom-footer/sync.tsx 中是「按当前 activeFilePath 同步」:
      • 需要单篇打开文章并触发同步,才会将对应的 Markdown 文件上传到远程仓库。
      • 没有一个入口可以对当前工作区里所有文章批量执行这个同步逻辑。

结果是:

  • 即使工作区里已经有很多本地 Markdown 文件,它们也不会自动出现在远程同步仓库中;
  • 用户需要逐篇打开并同步,或者手动触发自动同步,才能把这些文件一点点推到远端。

期望行为(Expected Behavior)

希望增加一个批量文章同步能力,例如:

  • 在标题栏同步菜单或设置页面中增加一个按钮:
    • 「上传当前工作区所有文章到同步仓库」
  • 功能行为:
    • 扫描当前工作区下符合 NoteGen 识别规则的所有 Markdown 文件(例如与记录关联的 activeFilePath 列表,或工作区内的 .md 文件)。
    • 根据当前 primaryBackupMethod(Github/Gitee/Gitlab/Gitea):
      • 对每个文件复用现有的单篇同步逻辑:
        • 如果远程不存在,则创建新文件;
        • 如果远程存在,则根据 sha 进行更新。
    • 允许在批量同步过程中展示进度 / 简单结果(成功/失败数量)。

这样可以方便用户在以下场景中使用:

  • 首次将本地已有大量 Markdown 笔记迁移到 NoteGen + Git 同步体系下;
  • 在更换同步仓库 / 重置远程仓库后,需要重新推送本地全部内容。

可能的实现思路(Suggestions)

仅作为参考,具体以项目设计为准:

  • 复用 core/article/custom-footer/sync.tsx 中单篇同步的实现:
    • 对多个 activeFilePath 进行循环调用;
    • 或者在工作区层面构建一份需要同步的本地文件列表。
  • 根据现有的 primaryBackupMethod 自动选择对应的上传函数:
    • GitHub:uploadGithubFile
    • Gitee:uploadGiteeFile
    • Gitlab:uploadGitlabFile
    • Gitea:uploadGiteaFile
  • 可以增加一些保护选项,例如:
    • 只上传当前工作区中「已在 NoteGen 中存在记录」的文件;
    • 允许用户选择「仅上传新增文件」或「全部覆盖(按 sha 更新)」;
    • 批量同步时限制并发数,避免一次性 API 请求过多。

环境信息(Environment)

  • 平台:macOS
  • 同步后端:Gitea(自建实例)
  • NoteGen:本地构建的桌面端(Tauri)
  • 已开启工作区功能,文件在客户端列表中可以正常显示

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions