来试试我写的 dotfile 备份工具 dotbackup 吧

dotbackup 是一个简单且高度可定制的 dotfile 备份工具,包含两个命令:dotbackupdotsetup,分别负责备份和恢复备份。基础的 dotbackup 配置十分简单,只需要提供备份路径和需要备份的文件路径,假如想要备份 Vim 和 Neovim,那么可以写一个这样的配置文件:

# 配置文件路径:~/.config/dotbackup/dotbackup.yml
backup_dir: ~/backup
apps:
  vim:
    files: [~/.vimrc]
  nvim:
    files: [~/.config/nvim]

然后就可以用 dotbackup 来备份所有文件到 ~/backup,或是 dotbackup app_name ... 来备份任意的应用,dotsetup 则是执行相反的操作恢复备份。这就是 dotbackup 的基础用法,逻辑简单粗暴,就是将文件以相对于家目录的相对路径复制到备份文件夹,比如 ~/.vimrc 会被复制到
~/backup/.vimrc

dotbackup 的主要设计理念就是尽可能简单,所以核心功能就只是复制文件,不包含版本管理,推荐配合 Git 来使用。但 dotbackup 也提供了一些高级功能来满足特殊需求,比如可以执行 Shell 脚本的 hook 功能,我会用这个功能来配置 Git:

apps:
  git:
    pre-setup:
      - |
        git config --global user.name "your name"
        git config --global user.email "your email"

dotbackup 还有一些好用的配置选项,比如和系统相关的文件选项,具体可以查看 GitHub 主页上的文档,也可以参考我的 dotfiles

使用截图

安装

可以通过 AUR 或 archlinuxcn 仓库下载安装。

But Why?

现在已经有了很多 dotfile 管理工具,为什么还要写一个呢?以及为什么要写成这样呢?答案是为了满足我自己的需求,dotbackup 的每一项功能都是为了解决我的一个需求,每个人的需求都不一样,所以 dotbackup 很可能并不适合你,但我想分享一下我在写 dotbackup 时的一些想法,如果你也有相同的需求,那就试试 dotbackup 吧,也欢迎提出问题或建议。

  • 为什么使用 YAML 作为配置文件?
    因为我希望配置文件尽可能简单。

  • 备份文件时为什么不转换隐藏路径?
    很多人不喜欢备份的文件有 . 开头的隐藏路径,这个问题可以通过设置一种路径转换规则来解决,但我觉得这个问题影响不大,而且可以通过软链接或 hook 部分解决该问题,我也希望通过 dotbackup 备份的 dotfiles 也可以被不用 dotbackup 的用户使用(cp -r backup_dir/. ~ 很多时候都可以代替 dotsetup),所以采用了简单的相对路径。

  • 如果我想备份的文件不在家目录下怎么办?
    配置 dotfile_root 或使用 hook 来备份。

  • 为了解决多个系统配置不同的问题,dotbackup 支持多个配置文件。

  • 为了解决不同系统 dotfile 路径不同的问题,dotbackup 支持系统相关的路径选项:files_linux, files_macos, files_windows

  • 为了解决部分文件在不同系统上会有冲突,dotbackup 支持分系统分应用设置备份文件夹。

  • dotbackup 支持忽略某些文件,这对于会在配置文件夹生成文件的应用很好用。

2 Likes

支持跨平台挺好的, 我目前使用的是 Ansible (也是使用 YAML 格式的配置文件), 可惜不支持 Windows 平台.

不过 Windows 是顺带支持的,没有特殊处理 shell,hook 功能还是执行 sh 脚本,Windows 如果没安装 Git 用不了,以后会改成和 GitHub Actions 一样的逻辑,在 Windows 上使用 pwsh。你说的 Anisible 我看了一下,貌似已经支持 Windows 了:https://docs.ansible.com/projects/ansible/latest/os_guide/windows_usage.html 。不过它已经超出 dotfile 备份工具的范畴了,对我来说太重,另外我本来也是用 Python 写的,后面改成用 Rust 重写,因为可以产出无依赖的二进制方便分发。

不过它已经超出 dotfile 备份工具的范畴了,对我来说太重

确实, Ansible 本身其实也不是用于备份 dotfiles 的.

准确说我是使用 Ansible 来配置整个环境, 包括为 dotfiles 创建软连接. 这样之后我对 dotfiles 的修改会被自动同步到一个本地的 Git 仓库里, 然后我就可以很自然的使用 Git 进行备份和同步了.

我目前还没遇到什么问题, 所以其实还清楚直接复制 dotfiles 来进行备份的好处. 不知道你对此有什么看法? :thinking:

貌似已经支持 Windows 了

Ansible 支持使用 SSH 连接去配置其他的计算机 (包括 Windows, 也就是你给出文档提及的), 但如果只是想配置自己的电脑, 就需要在本地安装 Ansible. 而官方文档目前是明确指出不支持 Windows 的. 我当时得知这一点觉得挺可惜的. :face_exhaling:

Ansible 支持使用 SSH 连接去配置其他的计算机 (包括 Windows, 也就是你给出文档提及的), 但如果只是想配置自己的电脑, 就需要在本地安装 Ansible. 而官方文档目前是明确指出不支持 Windows 的. 我当时得知这一点觉得挺可惜的. :face_exhaling:

原来如此,我以为你是有一台主机来配置其他所有机器,如果只是为了配置 Windows 而去整一台控制主机也没必要。

准确说我是使用 Ansible 来配置整个环境, 包括为 dotfiles 创建软连接. 这样之后我对 dotfiles 的修改会被自动同步到一个本地的 Git 仓库里, 然后我就可以很自然的使用 Git 进行备份和同步了.
我目前还没遇到什么问题, 所以其实还清楚直接复制 dotfiles 来进行备份的好处. 不知道你对此有什么看法? :thinking:

软链接这个方法确实不错,我一开始写这个工具的时候没有想到,复制文件比软链接好的唯一一点可能就是独立了,即使 dotfiles 仓库移动或删除也能用,不过几乎不可能出现这种情况。我更习惯这种独立的工作方式,有时候我本地的 dotfiles 修改过,上游仓库也修改了,这时候我可以不提交本地修改,直接拉取上游更改,然后再比较两边的修改选择提交。

有一种情况软链接的确是最优选择,有些应用在不同系统上的配置文件路径不同但内容一样,用软链接就可以只在仓库里维护一份备份。我的 dotfiles 仓库里也用了软链接来应对这种情况,不过因为软链接的特性,复制依然是复制原文件,所以不会同步更改。

dotbackup 的 hook 功能是我对简单备份功能的补充,理论上也能满足你的需求,安装软件、创建软链接都可以写成 shell 脚本,不过没有 Ansible 的 API 那么方便。