caveman:用纯文本+Git打造永不过时的个人知识管理系统
caveman 这个名字听起来就像石器时代的产物我却把它当成一个精心设计的个人知识管理项目代号。用这个代号多少带点自嘲当我先后折腾过 Notion、Obsidian、印象笔记、Wolai 这些工具之后真正让我坚持记录、快速找回内容的竟然是一套没有任何图形界面的纯文本方案。它不依赖特定软件、不要求复杂的数据库、也不需要每个月为同步功能付费只需要你熟悉几个最基本的能力文件夹、Markdown 文件和 Git。你可以把 caveman 想象成一间极简的原始小屋没有复杂的装修但每一件摆进去的东西你都清楚知道放在哪里。它适合那些想长期积累知识、又不想被工具绑架的人。它不一定能让你的文字写得更好但能让你少一些选择焦虑把精力放回内容本身。这篇文章是我把整套方案从零搭建起来并稳定用了大半年的完整记录包括目录结构、核心脚本、常见坑还有一些只有真正踩过才说得清的细节。1. 为什么会有 caveman从复杂工具中逃回石器时代1.1 我经历过的工具焦虑说实话我的笔记历史最早可以追溯到印象笔记刚流行那会儿。后来又因为担心数据被绑定搬到 Bear再后来觉得 Markdown 更自由就尝试了 Notion。结果每次打开都要等网络转圈原本想记一句话最后变成了等页面加载。更让我崩溃的是每次换工具都意味着一次大迁移导出、转换、重新分类折腾一圈总有一批图片和格式烂在旧工具里。我逐渐意识到工具并不会让我的记录变多反而每一次工具升级都在消耗我的注意力。真正卡住我的不是少一个双向链接不是少一个 Database而是我根本不敢开始写。越复杂的工具需要承担的维护成本越高要研究快捷键、要维护标签体系、要调整视图布局。这些听起来没什么但每一个细节都是决策每一个决策都在挤占写作的能量。于是我做了一个很原始的决定把笔记系统打回石器时代。我不会再去寻找完美的笔记软件而是亲手搭一个足够简单、足够可靠、几十年后仍然能用的本地记录系统。这个系统不需要联网不需要服务器更不需要看厂商的脸色。它只建立在三个永远不会消失的东西上文件夹、文本文件、版本控制。1.2 caveman 的核心设计原则caveman 从第一行代码开始就遵循三个原则。第一个原则是纯文本优先。所有内容都用 Markdown 保存不引入私有格式、不嵌入二进制对象。图片可以统一放到 assets 目录但文字本身永远是.md文件。纯文本的好处太多了任何编辑器都能打开、占用空间极小、搜索速度快、不会因为版本升级而不可读。就算哪天我用不了任何现代软件只要有一台能显示文字的终端我的知识库就还在。第二个原则是一切皆文件脚本为接口。交互入口不是图形界面而是一个个短小的 Shell 脚本。新增笔记用new.sh全文搜索用rg周回顾用review.sh。整个系统没有常驻进程不占内存只在你需要的时候执行一条命令。听起来简陋但恰恰因为简陋才不会有某个服务挂了导致用不了的情况。第三个原则是Git 作为唯一真相。所有历史版本、多设备同步、误删恢复全部交给 Git 处理。我不需要额外维护一个云同步服务也不需要担心数据被算法推荐。Git 已经在工程界存在了二十多年它的可靠性远超任何一款商业笔记软件的同步后台。这三个原则看起来平淡无奇但组合起来之后整套系统几乎不会给你添麻烦。你可以一周不开它它依然安静地躺在那里等你想起它的时候用一条命令就能回到工作状态。2. caveman 的整体架构与核心设计拆解2.1 目录结构与笔记命名规范caveman 的目录结构是这套系统的基础我把它固定为五个区域加一个脚本目录caveman/ ├── 0-inbox/ # 临时捕捉区速记、灵感、待整理 ├── 1-notes/ # 永久笔记区整理后的知识条目 ├── 2-projects/ # 项目档案区按项目组织过程文档 ├── 3-journal/ # 日记与周回顾时间流记录 ├── 9-assets/ # 附件与图片笔记引用的静态文件 └── _bin/ # 所有辅助脚本集中存放这样划分的逻辑很简单没有接收区的工具很难坚持用因为记录的动作必须足够快没有永久笔记区临时内容越堆越多最终放弃整个系统项目档案区是为了让某件事形成闭环从过程文档到总结都能在一个目录内找到日记区给时间维度assets 区保证笔记目录不被图片和 PDF 弄乱。命名规范同样重要。我规定所有 Markdown 文件统一使用YYYYMMDD-短横线标题.md的格式例如20250115-用stdbuf解决缓存卡顿.md。日期放在文件名最前面有好处按名称排序时天然形成时间倒序搜索和归档都方便。短横线代替空格避免在 Shell 和 URL 中遇到转义问题。如果你需要写得更精确还可以在日期后加上项目缩写比如20250115-prd-登录优化.md。2.2 用纯文本和 Git 解决存储与同步很多人一开始好奇为什么不用现成的云笔记软件这里有一个重要的取舍同步问题。商业工具把同步做成了黑盒你永远不知道数据是否完整、是否被审查、是否会被突然收费。caveman 把同步权交还给 Git 本身多设备之间只是 Git 仓库之间的推送和拉取。我对比过几类方案的差异方案类型数据安全离线可用历史版本长期成本商业云笔记Notion/印象依赖厂商部分支持有限订阅费 迁移风险网盘目录同步Dropbox/坚果云较高支持依赖版本功能容量限制纯文本 自建 Git 仓库完全自主完整支持每次提交都可回溯几乎没有选择 Git 还有一个额外收获提交信息就是你的复盘时间线。我习惯在每天结束时执行git add . git commit -m 2025-01-15 review一个月后回看提交记录就能清楚地知道那段日子自己在关注什么。这种元数据是商业软件给不了你的。2.3 核心脚本的功能设计caveman 的日常使用主要依赖四个脚本。new.sh新建笔记自动用日期拼文件名、写入模板、打开编辑器。search.sh基于 ripgrep 实现全文搜索并支持按目录和标签过滤。review.sh周回顾脚本列出本周新增与修改的笔记生成回顾清单。tasks.sh扫描所有待办标记如- [ ]生成待办事项列表。四个脚本共享同一个根目录配置所以第一次使用时只需要修改脚本顶部的CAVE_ROOT变量。脚本都放在_bin/里并把这个目录加进 PATH然后用短命令调用。比起安装一个 App这种手工拼装的方式多了一点仪式感但也多了一分可控感。3. 从零搭建 caveman实操全过程3.1 初始化项目骨架先在目标位置创建目录结构并初始化 Git 仓库。mkdir -p ~/caveman/{0-inbox,1-notes,2-projects,3-journal,9-assets,_bin} cd ~/caveman git init接着添加一个README.md把系统约定写清楚包括目录用途和命名规则。这一步对长期使用非常重要否则过段时间你自己都会忘记当初的设计。touch README.md建议在 README 里写一段简单的使用说明然后做第一次提交。git add . git commit -m init caveman到这里系统骨架已经成立。注意如果你在 Windows 上使用建议开启 WSL 或用 Git Bash因为后面的脚本都是 Bash 语法。macOS 和 Linux 则开箱即用。3.2 编写新增笔记的脚本先把_bin/new.sh创建出来。这是整个系统里使用频率最高的命令它会自动生成带日期的文件名并打开你默认的编辑器。#!/usr/bin/env bash set -euo pipefail CAVE_ROOT~/caveman TARGET_DIR${2:-$CAVE_ROOT/0-inbox} TODAY$(date %Y%m%d) TITLE${1:-untitled} SAFE_TITLE$(echo $TITLE | tr ./: _) FILE$TARGET_DIR/${TODAY}-${SAFE_TITLE}.md if [ -f $FILE ]; then echo 已经存在$FILE exit 1 fi cat $FILE EOF # ${TITLE} Date: $(date %Y-%m-%d) ## 内容 EOF ${EDITOR:-vi} $FILE我解释几个关键点。set -euo pipefail是写给 Shell 脚本的安全带遇到错误直接退出避免在错误树上继续执行。SAFE_TITLE把标题中的空格、斜杠、冒号都转成下划线这样文件名不会因为包含特殊字符而引发问题。${EDITOR:-vi}表示优先使用你自己设置的EDITOR环境变量没有就回退到 vi。使用时在caveman目录下执行_bin/new.sh 用fzf做笔记搜索它会在0-inbox/生成一个类似20250115-用fzf做笔记搜索.md的文件并打开编辑器。如果你希望直接写进某个分类目录可以传入第二个参数_bin/new.sh Logseq数据库结构分析 ~/caveman/1-notes注意这里的路径是为了当前操作临时指定实际项目中建议把所有新笔记默认放到 inbox整理时再移动避免还没想好分类就陷入纠结。3.3 实现快速检索与标签过滤笔记系统成败的关键在于能不能快速找到内容。我选择 ripgrep 作为搜索引擎它比 grep 快很多而且默认忽略二进制文件。最简单的全文搜索命令是rg -n 关键字 ~/caveman-n显示行号。如果只想看某个目录就把路径缩小到1-notes或2-projects。我习惯再加一个--type md排除非 Markdown 文件rg -n --type md 关键字 ~/caveman如果笔记里有标签比如#编程也可以直接搜标签rg -l #编程 ~/caveman/1-notes-l只输出文件名不输出匹配行适合用于批量重命名或进一步筛选。为了更顺手我把搜索命令封装到_bin/search.sh里并加入目录参数#!/usr/bin/env bash set -euo pipefail CAVE_ROOT~/caveman SEARCH_DIR${2:-$CAVE_ROOT} rg -n --type md $1 $SEARCH_DIR之后用_bin/search.sh API设计一条命令完成任务。如果你喜欢交互式选择结果可以配合 fzf先让 ripgrep 输出文件列表再用 fzf 选定文件后用编辑器打开。这种方式在笔记数量很大时尤其好用。3.4 把周回顾变成例行公事笔记只输入不整理很快会变成一堆文字垃圾。我给自己设定了一个轻量循环每天记录每周回顾。周回顾用脚本完成把本周新增和修改的笔记列出来生成一个回顾模板。#!/usr/bin/env bash set -euo pipefail CAVE_ROOT~/caveman cd $CAVE_ROOT echo 本周新增/修改笔记 find 0-inbox 1-notes 2-projects 3-journal -type f -name *.md -mtime -7 | sort注意find的时间参数在 Linux 和 macOS 上有差异。Linux 的 GNU find 支持-mtimemacOS 的 BSD find 也支持但如果你想精确到最近一周更稳妥的是用-mtime -7。如果你的系统不支持也可以用find . -name *.md -newermt $(date -v-7d %Y-%m-%d) 2/dev/null || \ find . -name *.md -newermt $(date -d -7 days %Y-%m-%d)这段命令在 macOS 上用date -v-7d在 Linux 上用date -d -7 days哪个成功用哪个。我在脚本里默认保留这一行省去手动判断的麻烦。周回顾时打开生成的清单每一条问自己三个问题这条笔记值得保留吗如果需要保留放进正确目录了吗如果已经整理过要不要更新一个小结完成之后把清单作为当天日记的附件内容合并进3-journal/然后提交一次 Git。4. 用 caveman 的真实工作流示例4.1 一个产品经理的日常工作流假设你是一个产品经理白天排满会议零碎信息来得非常快。使用 caveman 的方式是会议中听到任何需求、用户反馈、竞品细节先立刻记到0-inbox/。这一步不要求格式一句话或者几个关键词都行关键是先存下来。下班前你抽出十五分钟执行一次整理。把依然相关的需求移动到2-projects/需求调研/把可复用的认知归入1-notes/。第二天早上打开项目目录时你会看到前一天的会议重点而不是满屏乱飞的零散便签。等到一周结束运行_bin/review.sh你就能清楚看到这周推进了哪几个项目、哪些想法还悬在半空。这种记录-整理-回顾的节奏正好对应产品工作中常见的发散-收敛-复盘循环。不需要开额外的东西就把工作流和知识流统一到了同一个底层。4.2 一个程序员的技术笔记流转路径程序员这个群体其实最应该感谢纯文本。我处理技术笔记的路径是遇到一个 bug先用最原始的手段定位问题。有人会调侃这是 caveman debugging用 printf 打印日志、用二分法注释代码慢慢逼近问题根因。事实上这种看似笨拙的方法恰恰是最可靠的调试方式因为它不依赖任何调试器魔法每一项输出都来自你自己的观察。排查过程中的每一步尝试我都会顺手记到0-inbox/。定位到根因后写一篇1-notes/笔记比如20250115-解决跨平台换行符问题.md。笔记里包括现象、原因、解决方案、验证方法甚至可以把问题复现脚本也放进去。这些笔记会在未来的某一天救你一次。当处理过的临时代码被翻出来或者接到一个结构相似的 bug 时你不再需要从头排查直接_bin/search.sh 换行符就能找到当时的完整记录。这种自己的知识库比任何收藏夹都有用。4.3 手机上也能用移动端同步与随手记纯文本方案离开电脑也能工作。我通常在手机端保留一个只读副本随手查看和分享。方法很简单把 caveman 目录推送到一个私有 Git 仓库手机上安装一个支持 Git 的编辑器客户端拉取最新版本用手机编辑再推送。如果平时不在外面写长文只记录灵感也可以不用 Git直接把0-inbox/单独同步到手机。例如用 Syncthing 做局域网或点对点同步整个过程不经过第三方服务器。走到哪记到哪回到电脑前再统一整理。这里有一个经验手机端尽量少做深度整理。屏幕小、输入效率低只适合快速追加内容和查资料。真正的整理、归纳、沉淀一定在电脑上完成。移动端和桌面端各司其职才不会让同步变成负担。5. 常见问题与排查技巧实录5.1 中文文件名乱码问题纯文本虽然简单但中文环境下的乱码问题很常见。如果发现文件名显示乱码或者搜索时中文搜不到多半不是内容损坏而是系统 locale 设置不对或者某些文件被 Windows 编辑器保存成了其他编码。第一件事是通过file命令检查文件编码file 20250115-测试.md正常输出应该包含UTF-8。如果是ISO-8859或者ASCII说明编辑器可能用了非 UTF-8 保存。可以在脚本开头强制设置 localeexport LC_ALLen_US.UTF-8 export LANGen_US.UTF-8在 macOS 或 Linux 上这样就能保证find、sort、rg对中文按正常字符顺序处理。Windows 用户使用 WSL 时也建议在~/.bashrc里加上这两行。5.2 文件名带空格导致脚本失灵的坑我最初写new.sh时直接用$1.md生成文件名结果标题里一出现空格整条命令就断裂。为什么会断Shell 默认按空格切分参数未被引号包裹的变量会被拆成多个参数。例如# 错误写法 FILE$TARGET_DIR/echo $1/$TODAY-echo $1.md一旦$1包含空格FILE的值里就会带着空格后续cat $FILE和editor $FILE都可能读错路径。解决办法有两个文件名级别转义空格变量引用加引号。我用tr ./: _把所有空格、斜杠、冒号转成下划线文件名里干脆不出现空格。同时所有命令里的$FILE都加上引号确保万一文件名里仍有空格也不会被拆开。这个习惯要写进脚本的每一处否则换到其他脚本时很容易重新踩坑。5.3 Git 冲突与多设备同步多设备都提交、推送之后你偶尔会遇到 Git 冲突。比如电脑上改了一篇笔记手机端又改了同一个文件拉取时就会冲突。第一次遇到时不要慌这是正常的版本控制行为。我的处理方式很简单打开冲突文件找到、、标记之间的内容手动选择保留哪一边然后用git add标记解决再提交合并。更重要的是一开始就减少冲突的概率。我养成了一个习惯每台设备只看重某一部分内容。电脑上操作1-notes和2-projects手机上只追加0-inbox。划分清晰的职责后同一时间编辑同一个文件的概率会低很多。另外任何设备在开始工作前先git pull结束后及时git push不要攒一天的变更。5.4 临时笔记堆积成山怎么办很多人使用类似方案时会死在 inbox 堆积上。我大概在第二个月就遇到了这个情况。看到0-inbox/里躺着几十条当时觉得重要、现在完全想不起来的笔记动力瞬间少了一半。后来我给自己定了一个规则每次新建笔记时问自己一句这条内容就算 48 小时之后再看还会重要吗如果不确定也照记不误。真正解决问题的是每周日的定向清理我会把所有超过 30 天没有修改的 inbox 文件列出来统一归档find 0-inbox -type f -name *.md -mtime 30 | sort这条命令把陈旧内容全部暴露出来。我通常做三个动作内容有长期价值的移动到1-notes/属于某个项目的移动到2-projects/其余的直接删除。删除也是一种整理敢于删东西的笔记系统才可能保持清爽。6. 实战心得与进阶扩展6.1 坚持用了半年后我留下的几个习惯用 caveman 的时间越长越能体会到简单的系统需要配合理的习惯。我保留了三个习惯它们共同撑起了整个工具的价值。第一每天至少记一条。不一定是长篇大论哪怕只是今天在电梯里想到一个隐藏菜单这种半句话也行。持续记录能让你对灵感保持敏感也能让周回顾有足够素材。第二移动内容时顺手改文件名。如果一篇笔记从 inbox 移到1-notes/我会顺手把它从临时标题改成更清晰的YYYYMMDD-主题.md。这会倒逼自己想清楚这条知识到底应该被什么标题召唤出来。第三每周日固定跑一次review.sh。这不是向 KPI 看齐而是给自己一个放下这一周的仪式。看到这一周的输入被分类、归档、提交脑子里会有一种轻快感。哪怕这周产出的内容不多至少知道自己没白忙。6.2 可以继续扩展的方向caveman 目前做的是纯文本记录但它的骨架可以继续长出更多能力。比如任务管理在笔记中用- [ ]标记待办再写一个脚本扫描所有目录生成任务清单就能变成一个极简 GTD。再比如发布博客Markdown 文件本来就能被静态站点生成器消费加一层模板就能把私有笔记导出成对外博客。如果你想加全文索引可以用sed和sort生成词频统计也可以慢慢引入更重的检索工具。我目前还没有给系统加插件体系因为每加一项功能都要保证它不破坏原始感这个核心价值。如果你有能力维护更复杂的代码扩展是件很自然的事如果你的目标是持续记录那就保持现在这个状态也已经足够。6.3 最后想说的话有人可能会嘲笑这种方案太笨甚至不像这个时代该有的知识管理。但我用了大半年后最大的感受是越原始的工具越难被淘汰。你不需要在每次版本升级之后重新学习操作逻辑不用担心哪天厂商停服、数据迁移有多痛唯一需要维护的只有你自己的习惯。我甚至觉得 caveman 这个名字应该反过来理解不是原始人用上了现代工具而是现代人终于学会像原始人一样珍惜自己稀缺的注意力。如果你也正在为工具感到焦虑不妨从今天的日期和一个小文件夹开始。给第一篇文章起一个准确的名字然后一门心思写下去。也许不到一周你就会被这种简单直接的方式打动。