Mackup 是一个用来同步 OS X/Linux 系统下各种配置文件的命令行工具,它支持大量常用应用程序配置文件的备份和恢复,比如ssh、bash、vim、Sublime Text等。除了备份到本地磁盘之外,Mackup 还支持云端备份到 Dropbox 和 Google Drive。相对于使用 Time Machine 等传统模式的备份,Mackup 的优势在于,通过云端备份还原的方式可以完美实现数台 Mac 的无缝同步,也能极大简化新 Mac 的配置。

同步应用程序配置文件:Mackup

Mackup的原理

Mackup 的原理非常简单,将所有支持的配置文件全部复制到目标磁盘,然后删除原有文件,并在原位置创建一个同名软链指向备份的副本。所以 Python 核心功能代码也非常精简,很多代码都只是为了支持更多的软件配置而已。

其实之前我们自己玩 Dropbox 的时候也会这么用,但是 Mackup 把这件事做得更系统更彻底。

安装Mackup

安装 Mackup 有三种方式,在 OS X 下最简单的当然是brew。如果没装 Homebrew ,也可以用安装 Python 模块的常规方式安装。

  • brew install mackup
  • pip install mackup
  • 下载源码之后 python setup.py install

Mackup的使用

  • 备份:mackup backup
  • 还原:mackup restore

如果希望自定义一些细节设定,可以在自己的 HOME 目录创建 .mackupcfg 文件,写入一些配置语句。

[storage]
engine = google_drive
[applications_to_ignore]
ssh

以上定义使用 Google Drive 作为备份目的地,不备份 ssh 相关设定。详细解释可以看一个 .mackupcfg示例文件

路径和文件名含有非ASCII字符的问题

我在最初使用的时候有个插曲。Mackup所谓的备份到 Google Drive 和 Dropbox 都不是通过调用各自的 API 实现的(这样也比较麻烦),而是以系统内已经安装有客户端为前提,通过一个方法获取到本地同步文件夹的路径,然后直接把各项配置文件复制过去就算备份完成,上传操作交由客户端自行完成。以 Google Drive 为例,Mackup 是通过查询 Google Drive 配置文件夹里的一个sqlite数据库来获取到同步文件夹路径的,其返回值是一个unicode字符串,而在分析配置文件的代码中,作者居然用str()方法处理了一下然后返回这个路径,那么问题就来了。

因为我的系统语言是简体中文,所以Google Drive在本地的文件夹名是 “Google 云端磁盘”,包含有汉字,于是str()理所应当地出现 UnicodeEncodeError 错误。我大致看了一下其他地方的代码,如果路径或者文件名里有非ASCII字符,程序应该都会出错。这是一个很诡异的bug,照理一般我们不会粗暴地用str()来处理unicode字符串才对(Python3 全局unicode,可能结果不太一样),我唯一能想到的就是作者并不想管非英语国家的这些鸟事…

临时解决 Google Drive 中文路径这个问题很简单,把获取到的Google Drive路径用utf8 encode一下就好了。

-googledrive_home = unicode(data[0])
+googledrive_home = data[0].encode('utf-8')

像这种简单而又好用的命令行工具,貌似 Github 上不少,以后可以仔细挖掘一下。