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

标签 git backup

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

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

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

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


回答评论中的问题:

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

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

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

  • 完整备份 + 所有增量备份,此后包含我自动重建存储库所需的一切,包括所有分支。

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

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

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

如果我只需要处理一个分支,Git bundle 可以很好地满足所有这些要求。

最佳答案

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

预赛:

  1. 将最后一个备份可用为 backup.bundle
  2. 有一个 Remote backup指向 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 -style 参数来自 refs/heads
  3. 复制newbackup.bundle到您保存备份的任何地方
  4. 替换backup.bundlenewbackup.bundle所以你知道从哪里开始下一次增量备份

恢复:

  1. 拥有一个空的或代表旧版本的存储库
  2. 对于每个备份文件,按顺序:
    1. git remote rm recovery
    2. git remote add recovery <name-of-bundle>
    3. git fetch recovery – 您需要为 Remote 命名才能正常工作
  3. 现在您应该在 refs/remotes/backup 中拥有所有可用的分支

关于git - 使用 git bundle 对所有分支进行增量备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12129148/

相关文章:

git - 重新基于特定的提交

mysql - mysql备份脚本语法错误

git - 如何仅在第一次运行剧本时运行命令,在下次重新运行时跳过?

git - 推送到远程存储库的当前分支会更新远程的工作目录吗?

c - 运行 C 程序备份 Linux 文件

linux - 如何配置 vim 以保存额外的副本

java - 删除超过 30 天的 server.log.yyyy-mm-dd jboss eap 6.2 standalone

mysql - 备份和恢复 MySQL 数据库的 SQL 命令

eclipse - EGit的选项 "Auto share projects located in git repository"是什么意思?

git - Perforce p4 相当于 git 中的交换