所有分支都使用git bundle进行增量备份

时间:2012-08-26 09:50:58

标签: git backup

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

如果我只是想备份一个分支,我可以沿着这些方向做点什么:

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

但是如果我想备份所有内容(包括所有分支)呢?


回答评论中的问题:

严格地说,只要解决方案满足以下属性,我就不需要使用通常的Git包:

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

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

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

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

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

  • 我几乎可以对我的Git存储库进行任何完整备份,以及所有最近的增量备份,我可以简单地“拉”备份中的所有内容,并且存储库将是最新的。特别是,完全备份和增量备份之间是否存在部分重叠并不重要。
如果我只需要处理一个分支,那么Git捆绑包可以很好地满足所有这些。

4 个答案:

答案 0 :(得分:13)

(我们与Jukka讨论了这个问题,这是结果。)

预赛:

  1. 将最后一个备份设为backup.bundle
  2. 有一个指向backup
  3. 的远程backup.bundle

    进行备份:

    1. git fetch backup - 只是为了确保我们保持最新状态
    2. git bundle create newbackup.bundle ^backup/A ^backup/B A B C
      • 这意味着我们创建了一个捆绑包,该捆绑包排除了捆绑包中已有的所有内容
      • ^backup/A
      • 生成所需的refs/remotes/backup/式参数很容易
      • 同样,A - 样式参数来自refs/heads
    3. newbackup.bundle复制到您保留备份的位置
    4. backup.bundle替换为newbackup.bundle,以便知道从哪里开始下一次增量备份
    5. 恢复:

      1. 拥有一个空的存储库或代表存储库的旧版本
      2. 对于每个备份文件,依次:
        1. git remote rm recovery
        2. git remote add recovery <name-of-bundle>
        3. git fetch recovery - 您需要命名遥控器以使其正常工作
      3. 现在您应该在refs/remotes/backup
      4. 中提供每个分支

答案 1 :(得分:6)

尝试使用--since with --all。

创建第一个备份:

git bundle create mybundle-all --all

执行增量备份:

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

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

答案 2 :(得分:1)

你可以做到

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

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

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

答案 3 :(得分:-1)

似乎 opqdonut 解决方案无效,导致^ backup / A ^ backup / B仅指向上次增量备份。实际上,需要从之前的所有增量备份中排除引用。

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

UPD:不,它应该有效,请参阅下面的Jukka评论。