使用 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
显然是错误的,原因有二:
- 里面的
git rev-parse HEAD
用的是currentHEAD
,不一定正确;
- 如果前一个 bundle(初始或前一个微分)使用
refs/heads/br1
、refs/heads/br2
、refs/tags/t1
、refs/remotes/origin/r1
和 refs/remotes/origin/r2
作为其正参考规范通过 --all
,您需要负引用规范,它将从所有正引用规范中生成每个哈希 ID。
解决这两个问题的最简单方法是:
- 初始序列以
git rev-parse --all
结尾,输出保存在某处;
- 为了创建新的差异包,对上次保存的保存输出中列出的每个哈希 ID 使用
^$hash
;
- 创建新的差异包后,再次使用
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
的增量,即,这些每个都需要单独保存。
(无论如何,您最好还是使用真正的备份软件,但这可能会奏效。)
我想知道是否可以使用 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
显然是错误的,原因有二:
- 里面的
git rev-parse HEAD
用的是currentHEAD
,不一定正确; - 如果前一个 bundle(初始或前一个微分)使用
refs/heads/br1
、refs/heads/br2
、refs/tags/t1
、refs/remotes/origin/r1
和refs/remotes/origin/r2
作为其正参考规范通过--all
,您需要负引用规范,它将从所有正引用规范中生成每个哈希 ID。
解决这两个问题的最简单方法是:
- 初始序列以
git rev-parse --all
结尾,输出保存在某处; - 为了创建新的差异包,对上次保存的保存输出中列出的每个哈希 ID 使用
^$hash
; - 创建新的差异包后,再次使用
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
的增量,即,这些每个都需要单独保存。
(无论如何,您最好还是使用真正的备份软件,但这可能会奏效。)