演示视频
【杂谈】思源笔记之 Git 管理_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1xA4y1D79t/
更新
目前思源笔记已更新到 2.5.5 版本,其 GUI 启动模式发生变化,启动内核再启动
- 删除了原有的小工具(目前版本不适用了)
- 启动脚本将静默选项取消
- 修改 siyuan main.js 脚本在 GUI 启动时 判断内核是否启动,选择性拉起内核。
起源
项目要通过 git 进行离线管理,文档希望可以和项目一起走,思源笔记提供的双链模式很适合用于开发文档的编写和二次整理,希望探究一个基于 Git 的 SiYuan 笔记管理方式,实现笔记的另一种协同(可能还是会有多方面问题)。
思路
目标是在 git 项目中管理思源笔记,其本质是可以将任意文件夹启动为思源的工作目录。
- 探索需要管理的文件,根据用户手册的说明只管理 data 文件夹即可
- 需要以内核模式启动 SiYuan 笔记。
- 可以通过脚本将内核关闭,也可以启动的时候使用 非驻留模式,在不访问笔记本时自动关闭内核。
- 启动完内核后直接启动 APP。
实践
本实践在 windows 中进行,mac 或 linux 可以利用此思路自行探索。
通过 Web 启动
- 建立 git 空项目,并在内部建立 docs 文件夹(一般项目都是将 docs 作为文档目录)。
- 编写 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
- 编写 gitignore 文件 只管理 data 文件夹,同时不管理历史,下面的 gitignore 文件放到文档根目录即可。(这里没有管理思源笔记的)
/sync
/temp
/backup
/conf
/**/.siyuan/history
- 至此可以正常使用
通过 App 启动
-
还是在刚才的文件夹内修改启动脚本为如下所示
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"
-
修改 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 后依然可以使用
- 在 git 库中生成 二进制版本文件(这里用了我自己写的小工具,具体情况就不展开了)
- 将二进制文件克隆到新的位置,用脚本启动。
- 修改笔记内容,保存。
- 提交笔记
- 在老仓库拉取笔记内容
- 验证可以通过 git 管理笔记
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于