dotkeep

dotkeep

一份清单管好所有dotfiles

开发官网

应用介绍

换台机器最烦的不是装软件,是那一堆散落的配置:.zshrc 里攒了两年的别名、nvim 的 init.lua、tmux 的前缀键、/etc/hosts 里几行内网映射——每一样都得从旧机器里翻出来重贴一遍,漏一个就得等到用的时候才发现。dotkeep 把这件事压成一份纯文本清单:.dotkeep.conf 里一行一个路径dotkeep backup 按清单把文件抓进仓库,换机后 clone 下来一句 dotkeep restore 全部还原。

它跟常见的几类工具不一样的地方,是工具本体和备份仓库彻底分离:这个仓库只是那个 bash 脚本,你的配置存在另一个自己建的目录里,按 home/root/ 两棵树摆放,文件名和磁盘上完全一致——home/.zshrc 就是 $HOME/.zshrcroot/etc/hosts 就是 /etc/hosts,打开仓库一眼就知道存了什么。不做软链,不把 $HOME 当成 git 工作区,也不把文件改名成 dot_zshrc

软件功能



一份清单当唯一入口:.dotkeep.conf 是纯文本,一行一个路径,# 开头是注释,每条必须以 home/root/ 起头。要加要减就改这个文件,不用记命令、不用维护第二份状态。

home/ 和 root/ 两棵树:用户配置和系统配置写在同一份清单里,仓库结构和真实系统同构,层级、文件名一模一样,翻仓库和翻机器是一回事。

双向复制,不用软链:backup 和 restore 都是 rsync 实拷贝,活文件始终是普通文件。相比 Stow、rcm 这类用符号链接的方案,编辑器「写临时文件再改名覆盖」的保存方式不会把软链替换掉、导致仓库里还留着旧内容。

不拿 $HOME 当仓库:bare git 和 yadm 把家目录当工作区,一个 git add -A 就可能把 SSH 私钥和缓存提交上去,而且 /etc 根本放不进来。dotkeep 只碰清单里点名的路径。

每一步都先问:backup 和 restore 写盘前都要确认;restore 会先把现有的活文件挪到 /tmp/dotkeep.XXXXXX/ 备份一份再覆盖,路径不对的那条跳过,其余照常。

git 是可选的:存储本身就是那棵文件树。拷完之后它才问要不要 git add -A、commit、push,默认一律是「否」;不想用 git,换成 Syncthing 或者拷到移动硬盘同样成立。

check 先验一遍:dotkeep check 解析清单、把每条路径展开成真实位置并核对仓库里在不在,正式动手前能先看清楚会碰哪些文件。

默认就避开垃圾:符号链接(含嵌套)、设备文件、管道和套接字都不同步;嵌套的 .gitnode_modules 内容会被剥掉;超过 10 MiB 的文件跳过并告警(DOTKEEP_MAX 可调,上限 100 MiB,因为再大 GitHub 直接拒推);目录同步遵守仓库的 .gitignore

目录优先规则明确:清单里同时写了某个目录和它下面的子路径时,目录生效、子项丢弃;读不了的文件跳过,目录里其余内容照常拷贝,不会因为一个文件失败就整条中断。

依赖和限制:纯 bash 实现,需要 bash 5、git、rsync、tree、GNU coreutils,只支持 Linux,不支持 Windows;脚本自己不调 sudo,还原 root/ 需要你有对应写权限;模板、加密、按主机区分配置这些明确不做——需要的话作者建议去用 chezmoi 或 dotdrop。MIT 协议。