【分享】基于 Git 对思源笔记做管理 (windows),在项目中使用思源笔记作为文档工具

本贴最后更新于 700 天前,其中的信息可能已经渤澥桑田

演示视频

【杂谈】思源笔记之 Git 管理_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1xA4y1D79t/

更新

目前思源笔记已更新到 2.5.5 版本,其 GUI 启动模式发生变化,启动内核再启动

  • 删除了原有的小工具(目前版本不适用了)
  • 启动脚本将静默选项取消
  • 修改 siyuan main.js 脚本在 GUI 启动时 判断内核是否启动,选择性拉起内核。

起源

项目要通过 git 进行离线管理,文档希望可以和项目一起走,思源笔记提供的双链模式很适合用于开发文档的编写和二次整理,希望探究一个基于 Git 的 SiYuan 笔记管理方式,实现笔记的另一种协同(可能还是会有多方面问题)。

思路

目标是在 git 项目中管理思源笔记,其本质是可以将任意文件夹启动为思源的工作目录。

  1. 探索需要管理的文件,根据用户手册的说明只管理 data 文件夹即可
  2. 需要以内核模式启动 SiYuan 笔记。
  3. 可以通过脚本将内核关闭,也可以启动的时候使用 非驻留模式,在不访问笔记本时自动关闭内核。
  4. 启动完内核后直接启动 APP。

实践

本实践在 windows 中进行,mac 或 linux 可以利用此思路自行探索。

通过 Web 启动

  1. 建立 git 空项目,并在内部建立 docs 文件夹(一般项目都是将 docs 作为文档目录)。
  2. 编写 SiYuan 笔记的内核启动脚本,中间的 ping 是保证 kernel 完全启动后再开启浏览器。
start "siyuan-kernel" "C:\Program Files\SiYuan\resources\kernel\SiYuan-Kernel.exe" --wd="C:\Program Files\SiYuan\resources" --workspace=".\docs" 
ping -n 2 0.0.0.0 1>nul 2>nul
start http://127.0.0.1:6806
  1. 编写 gitignore 文件 只管理 data 文件夹,同时不管理历史,下面的 gitignore 文件放到文档根目录即可。(这里没有管理思源笔记的)
/sync
/temp
/backup
/conf
/**/.siyuan/history
  1. 至此可以正常使用

通过 App 启动

  1. 还是在刚才的文件夹内修改启动脚本为如下所示

    start "siyuan-kernel" "C:\Program Files\SiYuan\resources\kernel\SiYuan-Kernel.exe" --wd="C:\Program Files\SiYuan\resources" --workspace=".\docs"
    ping -n 2 0.0.0.0 1>nul 2>nul
    start "siyuan" "C:\Program Files\SiYuan\SiYuan.exe"
    
  2. 修改 main.js 启动文件。main.zip

    文件末尾增加如下函数,判断是否已启动内核

    const hasKernelRun = async () => {
        let apiData;
        try {
          const apiResult = await fetch(getServer() + "/api/system/version");
          apiData = await apiResult.json();
          writeLog("got kernel version [" + apiData.data + "]");
          return true;
        } catch (e) {
          writeLog("get kernel version failed: " + e.message);
          await sleep(100);
      } 
    
      return false
    
    }
    

    修改启动逻辑,判断启动内核后就不再拉起内核(在 initKernel 函数中)

     bootWindow = new BrowserWindow({
          width: screen.getPrimaryDisplay().size.width / 2,
          height: screen.getPrimaryDisplay().workAreaSize.height / 2,
          frame: false,
          icon: path.join(appDir, 'stage', 'icon-large.png'),
          transparent: 'linux' !== process.platform,
          webPreferences: {
            nativeWindowOpen: true,
          },
        })
    
        const kernelName = 'win32' === process.platform ? 'SiYuan-Kernel.exe' : 'SiYuan-Kernel'
        const kernelPath = path.join(appDir, 'kernel', kernelName)
        if (!fs.existsSync(kernelPath)) {
          showErrorWindow('⚠️ 内核文件丢失 Kernel is missing',
            `<div>内核可执行文件丢失,请重新安装思源,并将思源加入杀毒软件信任列表。</div><div>The kernel binary is not found, please reinstall SiYuan and add SiYuan into the trust list of your antivirus software.</div>`)
          bootWindow.destroy()
          resolve(false)
          return
        }
    
        if (! await hasKernelRun()) {
              const availablePort = await getKernelPort()
        const cmds = ['--port', availablePort, '--wd', appDir]
        if (isDevEnv) {
          cmds.push('--mode', 'dev')
        }
        if (initData) {
          const initDatas = initData.split('-')
          cmds.push('--workspace', initDatas[0])
          cmds.push('--lang', initDatas[1])
        }
        let cmd = `ui version [${appVer}], booting kernel [${kernelPath} ${cmds.join(' ')}]`
        writeLog(cmd)
        let kernelProcessPid = ""
        if (!isDevEnv) {
          const cp = require('child_process')
          const kernelProcess = cp.spawn(kernelPath,
            cmds, {
              detached: false, // 桌面端内核进程不再以游离模式拉起 https://github.com/siyuan-note/siyuan/issues/6336
              stdio: 'ignore',
            },
          )
          kernelProcessPid = kernelProcess.pid
          writeLog('booted kernel process [pid=' + kernelProcessPid + ']')
    
          kernelProcess.on('close', (code) => {
            writeLog(`kernel exited with code [${code}]`)
            if (0 !== code) {
              switch (code) {
                case 20:
                  showErrorWindow('⚠️ 数据库被锁定 The database is locked',
                    `<div>数据库文件正在被其他进程占用,请检查是否同时存在多个内核进程(SiYuan Kernel)服务相同的工作空间。</div><div>The database file is being occupied by other processes, please check whether there are multiple kernel processes (SiYuan Kernel) serving the same workspace at the same time.</div>`)
                  break
                case 21:
                  showErrorWindow('⚠️ 监听端口 ' + kernelPort + ' 失败 Failed to listen to port ' + kernelPort,
                    '<div>监听 ' + kernelPort + ' 端口失败,请确保程序拥有网络权限并不受防火墙和杀毒软件阻止。</div><div>Failed to listen to port ' + kernelPort + ', please make sure the program has network permissions and is not blocked by firewalls and antivirus software.</div>')
                  break
                case 22:
                  showErrorWindow(
                    '⚠️ 创建配置目录失败 Failed to create config directory',
                    `<div>思源需要在用户家目录下创建配置文件夹(~/.config/siyuan),请确保该路径具有写入权限。</div><div>SiYuan needs to create a configuration folder (~/.config/siyuan) in the user\'s home directory. Please make sure that the path has write permissions.</div>`)
                  break
                case 23:
                  showErrorWindow(
                    '⚠️ 无法读写块树文件 Failed to access blocktree file',
                    `<div>块树文件正在被其他程序锁定或者已经损坏,请删除 工作空间/temp/ 文件夹后重启</div><div>The block tree file is being locked by another program or is corrupted, please delete the workspace/temp/ folder and restart.</div>`)
                  break
                case 0:
                case 1: // Fatal error
                  break
                default:
                  showErrorWindow(
                    '⚠️ 内核因未知原因退出 The kernel exited for unknown reasons',
                    `<div>思源内核因未知原因退出 [code=${code}],请尝试重启操作系统后再启动思源。如果该问题依然发生,请检查杀毒软件是否阻止思源内核启动。</div>
    <div>SiYuan Kernel exited for unknown reasons [code=${code}], please try to reboot your operating system and then start SiYuan again. If occurs this problem still, please check your anti-virus software whether kill the SiYuan Kernel.</div>`)
                  break
              }
    
              bootWindow.destroy()
              resolve(false)
            }
          })
        }
        }
    
        let gotVersion = false
    

验证笔记被 clone 后依然可以使用

  1. 在 git 库中生成 二进制版本文件(这里用了我自己写的小工具,具体情况就不展开了)
  2. 将二进制文件克隆到新的位置,用脚本启动。
  3. 修改笔记内容,保存。
  4. 提交笔记
  5. 在老仓库拉取笔记内容
  6. 验证可以通过 git 管理笔记
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22337 引用 • 89380 回帖
5 操作
yss930819 在 2022-12-22 10:17:30 更新了该帖
yss930819 在 2022-04-29 23:32:14 更新了该帖
yss930819 在 2022-04-29 23:29:31 更新了该帖
yss930819 在 2022-04-29 23:27:58 更新了该帖 yss930819 在 2022-04-29 14:26:20 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...