git-annex
归档、备份还是同步
归档、备份和同步总是在相似的场合被混用。然而我认为它们并不是等价的。我对它们的定义如下:
已经有了各式各样功能齐全的轮子能完成备份和同步工作。但是像 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。