24

使用 git 存储库进行增量备份的最简单方法是什么git bundle

如果我只想备份一个分支,我可以按照以下方式做一些事情:

git bundle create foo last-backup..master
git tag -f last-backup master

但是,如果我想备份所有内容(包括所有分支)怎么办?


要回答评论中的问题:

严格来说,我不需要使用通常的 Git 捆绑包,只要解决方案满足以下属性即可:

  • 每个增量备份都是一个文件。我可以将它存储在某个地方,后续增量备份不需要修改此文件。

  • 该文件的大小大约等于自上次备份以来 Git 提交的总大小。二进制文件中的更改也可以有效地存储。

  • 从那时起,完整备份 + 所有增量备份包含我需要自动重建存储库的所有内容,包括所有分支。

(举个简单的例子,在 git 存储库中简单地用最近更改的文件构建一个 tar 存档无法满足第二个要求,例如,如果发生了自动垃圾收集。)

理想情况下,我还希望有一个防白痴的系统:

  • 我几乎可以对我的 Git 存储库进行任何完整备份,以及所有最近的增量备份,并且我可以简单地从备份中“提取”所有内容,并且存储库将是最新的。特别是,完全备份和增量备份之间是否存在部分重叠并不重要。

如果我只需要处理一个分支,Git 包就可以很好地满足这一切。

4

4 回答 4

14

(我们和Jukka讨论过这个问题,这就是结果。)

预赛:

  1. 将最后一个备份作为backup.bundle
  2. 有一个遥控器backup指向backup.bundle

进行备份:

  1. git fetch backup– 只是为了确保我们是最新的
  2. git bundle create newbackup.bundle ^backup/A ^backup/B A B C
    • 这意味着我们创建了一个捆绑包,它排除了捆绑包中已经存在的所有内容
    • 很容易^backup/Arefs/remotes/backup/
    • 同样,A-style 参数来自refs/heads
  3. 复制newbackup.bundle到您保存备份的任何位置
  4. 替换backup.bundle为,newbackup.bundle以便您知道从哪里开始下一次增量备份

恢复:

  1. 拥有一个空的或代表旧版本的存储库的存储库
  2. 对于每个备份文件,按顺序:
    1. git remote rm recovery
    2. git remote add recovery <name-of-bundle>
    3. git fetch recovery– 您需要为遥控器命名才能使用
  3. 现在你应该有每个可用的分支refs/remotes/backup
于 2012-08-31T13:58:33.967 回答
6

尝试将 --since 与 --all 一起使用。

创建第一个备份:

git bundle create mybundle-all --all

做增量备份:

git bundle create mybundle-inc --since=10.days --all

增量应包含过去 10 天内发生的所有分支上的所有提交。确保 --since 参数可以追溯到足够远的地方,否则您可能会错过提交。如果在该时间范围内没有发生任何提交,Git 也会拒绝创建包,因此请做好计划。

于 2012-08-31T09:50:51.220 回答
1

你可以做

git clone --mirror <your_repo> my-backup.git

它将创建一个包含所有引用的裸仓库。

然后你可以定期做git push --mirror <my-backup>.

于 2012-08-26T20:45:00.773 回答
-1

似乎opqdonut解决方案不起作用,因为 ^backup/A ^backup/B 仅指向上次增量备份。并且实际上需要从所有以前的增量备份中排除 refs。

需要为以前的每个捆绑包创建遥控器。

UPD:不,它应该可以工作,请参阅下面的 Jukka 评论。

于 2013-03-01T20:40:17.950 回答