归档、备份还是同步

归档、备份和同步总是在相似的场合被混用。然而我认为它们并不是等价的。我对它们的定义如下:

  • 归档:存储不常用的文件。
  • 备份:能够恢复原件,例如 borg
  • 弱同步:副本与原件保持一致,例如 rsync
  • 强同步:所有副本与原件保持一致,任意一处的修改会传播到各处,例如 Syncthing

已经有了各式各样功能齐全的轮子能完成备份和同步工作。但是像 git-annex 一样的实现归档功能的却很少见。

我知道有像 tar 一样的 archiver,但是它们的功能仅相当于打包。我所认为的归档工具至少应该有以下功能:

  • 能够将不常用的文件传输到外置硬盘,需要的时候再传回来
  • 即使硬盘不在手边,也能够知道某个文件存储在哪个硬盘

git-annex 能完美地实现上述功能。

A stupid filename and metadata tracker

git-annex 自称「a stupid filename and metadata tracker」。git-annex 由名字可知使用 git 追踪,但是追踪的不是文件而是文件的文件名和元数据,仓库目录下的是符号连接,实际文件存储在 .git/annex。这么做的好处是每个仓库都有一份文件的文件名和元数据,可以在任意一个仓库查询文件所处位置,不需要每个仓库都有一份文件副本。这些特性使它能够很好地完成归档的工作。

用法

git-annex 的用法与 git 类似。以两个仓库为例,首先初始化两个仓库分别为 A 和 B 并且都将对方加入到 remote 中:

# 初始化仓库 A
mkdir /tmp/repoa
cd /tmp/repoa
git init
git annex init "Repo A"

# 初始化仓库 B
mkdir /tmp/repob
cd /tmp/repob
git init
git annex init "Repo B"

# 添加 remote
cd /tmp/repoa
git remote add repob /tmp/reopb
cd /tmp/repob
git remote add repoa /tmp/repoa

添加文件到 A:

cd /tmp/repoa
cp /tmp/ubuntu-20.04.iso .
git annex add ubuntu-20.04.iso
git commit -m added

同步到 B:

cd /tmp/repoa
git annex sync
cd /tmp/repob
git annex sync

在 B 下进行查询:

cd /tmp/repob
git annex list
here
|repoa
||web
|||bittorrent
||||
_X__ ubuntu-20.04.iso

如果要获取文件:

cd /tmp/repob
git annex get ubuntu-20.04.iso
git annex list
here
|repoa
||web
|||bittorrent
||||
XX__ ubuntu-20.04.iso

删除文件:

cd /tmp/repob
git annex drop ubuntu-20.04.iso
git annex list
here
|repoa
||web
|||bittorrent
||||
_X__ ubuntu-20.04.iso

移动文件:

cd /tmp/repob
git annex move ubuntu-20.04.iso --from repoa
git annex list
here
|repoa
||web
|||bittorrent
||||
X___ ubuntu-20.04.iso

更多参考官方的 walkthrough,基本覆盖了常用的功能。

更多功能

结合其他工具 git-annex 也可以使用远程服务器,或是用作备份或者同步,更多参考官方 tips