使用 git 包对 git 个存储库进行差异备份

Differential backups of git repositories using git bundle

我想知道是否可以使用 git bundle 像这样对 git 存储库进行差异备份:

第一次:

git clone --mirror https://github.com/me/myrepo
git bundle create base.bundle --all

每次我想创建差异包时:

cd myrepo
git fetch --all # is this necessary? (because "git bundle" doesn't check remote)
git bundle create diff.bundle $(git rev-parse HEAD)..HEAD --all

我的主要问题是上述方法是否确保 base.bundle 和 diff.bundle 一起使用时 包含从存储库创建到 diff.bundle 被占用,包括分支、标签,以及 git 存储库中我不知道的任何其他内容。

您的前两个命令可以很好地创建基本包。但是,您的第二组命令不会做正确的事情。您 do 想要 git fetch(只有当您有多个遥控器时才需要 --all),但您希望新创建的差分包使用“负 refspecs”完成" 对于前一个包中每个 positive refspec 的 ref。即:

git bundle create diff.bundle $(git rev-parse HEAD)..HEAD --all

显然是错误的,原因有二:

  1. 里面的git rev-parse HEAD用的是currentHEAD,不一定正确;
  2. 如果前一个 bundle(初始或前一个微分)使用 refs/heads/br1refs/heads/br2refs/tags/t1refs/remotes/origin/r1refs/remotes/origin/r2 作为其正参考规范通过 --all,您需要负引用规范,它将从所有正引用规范中生成每个哈希 ID。

解决这两个问题的最简单方法是:

  1. 初始序列以 git rev-parse --all 结尾,输出保存在某处;
  2. 为了创建新的差异包,对上次保存的保存输出中列出的每个哈希 ID 使用 ^$hash
  3. 创建新的差异包后,再次使用 git rev-parse --all 获取正 refspec 哈希 ID。

所以你最终会得到这样的结果:

git clone --mirror https://github.com/me/myrepo
git bundle create $HOME/b/base.bundle --all
git rev-list --all > $HOME/b/hashes

其次是:

cd myrepo
git fetch  # --all if needed, but per the above there's just one remote
git bundle create $HOME/b/diff.bundle $(sed s/^/^/ < $HOME/b/hashes) --all
git rev-list --all > $HOME/b/hashes

警告:这完全未经测试。我还假设 each diff.bundle 是对 previous diff.bundle 的增量,即,这些每个都需要单独保存。

(无论如何,您最好还是使用真正的备份软件,但这可能会奏效。)