【问题标题】:Fully backup a git repo?完全备份一个 git repo?
【发布时间】:2011-07-31 11:59:45
【问题描述】:

有没有一种简单的方法来备份整个 git repo,包括所有的分支和标签?

【问题讨论】:

  • 我猜你在这里指的是本地 git repos。
  • 正确答案是: git clone --mirror git@example.com/your-repo.git 这将复制你的整个仓库、笔记、分支、跟踪等。
  • 我运行的一些网络搜索在其结果中没有包含这个问题:“git clone absolute everything branch tags notes”; “git克隆存储库中的所有内容”; “git 克隆一个带有所有标签注释的仓库”。

标签: git backup


【解决方案1】:
git bundle

我喜欢这种方法,因为它只生成一个文件,更容易复制。
ProGit: little bundle of joy
另见“How can I email someone a git repository?”,其中的命令

git bundle create /tmp/foo-all --all

详细:

git bundle 只会打包由 git show-ref 显示的引用:这包括磁头、标签和远程磁头。
目的地持有使用的基础非常重要。
谨慎起见是可以的,这会导致捆绑文件包含目标中已经存在的对象,因为在目标解压时会忽略这些对象。


为了使用那个包,你可以克隆它,指定一个不存在的文件夹(在任何 git repo 之外):

git clone /tmp/foo-all newFolder

【讨论】:

  • 添加 --all 以完成备份
  • 这个,git bundle 是我认为的正确答案,而不是公认的答案。我认为他很了解克隆命令,如果他能提出这样的问题,显然对他来说是不够的(因为它是克隆,而不是转储)。转储是与简单副本不同的东西,例如:1)它们不需要是正常工作的最佳(或什至有能力)2)但它们需要具有良好的抵抗力和可修复性以防止数据损坏 3)它通常很有用如果它们对于增量备份很容易区分,而对于副本来说这不是一个目标。
  • 请注意,git bundlegit clone 都没有获得所有内容,例如挂钩脚本。
  • @Zitrax 是的,这是设计使然。挂钩可能很危险或包含敏感信息。
  • 我可以对远程仓库使用git bundle 吗?
【解决方案2】:

克隆它怎么样?

git clone --mirror other/repo.git

每个存储库都是其远程的备份。

【讨论】:

  • @Daniel:如果你克隆一个存储库,你会获取每个分支,但只有默认的一个被检出。试试git branch -a。也许这样更明显:克隆存储库后,您不会获取每个分支,而是获取每个提交。分支仅引用现有提交。
  • 我觉得他很了解clone命令,如果他能提出这样的问题,显然对他来说是不够的(因为它是clone,而不是dump)。转储与简单副本不同,例如:1) 对于正常工作,它们不需要是最佳的(甚至是有能力的)2) 但它们需要对数据损坏具有良好的抵抗力和可修复性。
  • @peterh 当然,但git clone 涵盖了所有这些。 (1) 是可选的,不是必需的。如果结果仍然优化,它仍然是一个备份(2)已经被 git 本身覆盖。 -- 我想说的是,如果git clone 已经涵盖了相关要点,那么您需要什么不同的工具?虽然我也更喜欢git bundle,但我不认为我的回答是错误的或无效的。您可以将这两种方法视为热备份与冷备份。
  • 文件权限呢? git clone 一定要复制那些吗?取决于我相信的选项
【解决方案3】:

扩展 KingCrunchVonC 的精彩答案

我把它们都结合了:

git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

之后,您就有了一个名为reponame.bundle 的文件,可以轻松地复制它。然后,您可以使用 git clone reponame.bundle reponame 创建一个新的普通 git 存储库。

请注意,git bundle 仅复制导致存储库中某些引用(分支或标签)的提交。所以纠结的提交不会存储到包中。

【讨论】:

  • 我想你的意思是git bundle create reponame.bundle --all
  • 感谢@joe 注意到这一点。确实。我会更新答案。
【解决方案4】:

扩展其他一些答案,这就是我所做的:

设置回购:git clone --mirror user@server:/url-to-repo.git

然后当您要刷新备份时:来自克隆位置的git remote update

这会备份所有分支和标签,包括以后添加的新分支,但值得注意的是,被删除的分支不会从克隆中删除(这对于备份可能是一件好事)。

这是原子的,所以没有简单副本会出现的问题。

http://www.garron.me/en/bits/backup-git-bare-repo.html

【讨论】:

    【解决方案5】:

    这个帖子对于了解如何备份 git repos 非常有帮助。我认为它仍然缺乏一些提示,信息或结论来为自己找到“正确的方式”(tm)。因此,在这里分享我的想法以帮助他人并提出讨论以增强他们。谢谢。

    所以从拿起最初的问题开始:

    • 目标是尽可能接近 git 存储库的“完整”备份。

    然后用典型的愿望丰富它并指定一些预设:

    • 首选通过“热拷贝”进行备份以避免服务停机。
    • git 的缺点将通过其他命令来解决。
    • 脚本应该执行备份以将多个步骤组合成一个备份并避免人为错误(错别字等)。
    • 此外,脚本应该执行恢复以使转储适应目标机器,例如甚至原始机器的配置也可能在备份后发生了变化。
    • Environment 是 Linux 机器上的 git 服务器,其文件系统支持硬链接。

    1。什么是“完整”git repo 备份?

    关于什么是“100%”备份的观点不同。这里有两个典型的。

    #1 开发者观点

    • 内容
    • 参考文献

    git 是一个开发者工具,通过git clone --mirrorgit bundle --all 支持这种观点。

    #2 管理员观点

    • 内容文件
      • 特殊情况“packfile”:git 在垃圾回收期间将对象组合并压缩成包文件(请参阅git gc
    • git 配置
    • 可选:操作系统配置(文件系统权限等)

    git 是一个开发者工具,把它留给管理员。 git 配置和操作系统配置的备份应该与内容的备份分开。

    2。技巧

    • “冷拷贝”
      • 停止服务以独占访问其文件。停机!
    • “热拷贝”
      • 服务为备份目的提供固定状态。正在进行的更改不会影响该状态。

    3。其他需要考虑的话题

    它们中的大多数都是通用的备份。

    • 是否有足够的空间来保存完整备份?将存储多少代?
    • 是否需要增量方法?将存储多少代以及何时再次创建完整备份?
    • 如何验证备份在创建后或随着时间的推移没有损坏?
    • 文件系统是否支持硬链接?
    • 将备份放入单个存档文件或使用目录结构?

    4。 git 为备份内容提供了什么

    • git gc --auto

      • 文档:man git-gc
      • 清理并压缩存储库。
    • git bundle --all

      • 文档:man git-bundle、man git-rev-list
      • Atomic = "热拷贝"
      • Bundles 是转储文件,可以直接与 git 一起使用(验证、克隆等)。
      • 支持增量提取。
      • 可通过git bundle verify验证。
    • git clone --mirror

      • 文档:man git-clone、man git-fsck、What's the difference between git clone --mirror and git clone --bare
      • Atomic = "热拷贝"
      • 镜像是真正的 git 存储库。
      • 此命令的主要目的是构建一个完整的活动镜像,定期从原始存储库获取更新。
      • 支持对同一文件系统上的镜像进行硬链接以避免浪费空间。
      • 可通过git fsck验证。
      • 镜像可用作完整文件备份脚本的基础。

    5。冷拷贝

    冷拷贝备份始终可以进行完整文件备份:拒绝所有对 git 存储库的访问,进行备份并再次允许访问。

    • 可能的问题
      • 可能不容易 - 甚至不可能 - 拒绝所有访问,例如通过文件系统共享访问。
      • 即使 repo 位于只有一个用户的客户端计算机上,该用户仍然可以在自动备份运行期间提交某些内容:(
      • 服务器可能无法接受停机时间,并且备份多个大型存储库可能需要很长时间。
    • 缓解的想法:
      • 通常防止通过文件系统直接访问 repo,即使客户端在同一台机器上。
      • 对于 SSH/HTTP 访问,使用 git 授权管理器(例如 gitolite)以脚本方式动态管理访问或修改身份验证文件。
      • 逐一备份存储库以减少每个存储库的停机时间。拒绝一个 repo,进行备份并再次允许访问,然后继续下一个 repo。
      • 有计划的维护计划以避免开发人员不高兴。
      • 仅在存储库更改时进行备份。可能很难实施,例如对象列表以及打包文件、配置和钩子的校验和等。

    6。热复制

    由于持续提交导致数据损坏的风险,无法使用活动存储库进行文件备份。 热拷贝为备份目的提供活动存储库的固定状态。正在进行的提交不会影响该副本。 如上所述,git 的克隆和捆绑功能支持这一点,但对于“100% 管理员”备份,必须通过其他命令完成几件事。

    “100% admin”热拷贝备份

    • 选项 1:使用 git bundle --all 分别创建内容的完整/增量转储文件和复制/备份配置文件。
    • 方案二:使用git clone --mirror,分别处理和复制配置,然后对镜像进行全文件备份。
      • 注意事项:
      • 镜像是一个新的存储库,在创建时填充了当前的 git 模板。
      • 清理配置文件和目录,然后从原始源存储库复制配置文件。
      • 备份脚本还可以应用操作系统配置,如镜像文件权限。
      • 使用支持硬链接的文件系统并在与源存储库相同的文件系统上创建镜像,以提高速度并减少备份期间的空间消耗。

    7.恢复

    • 检查并采用针对目标机器的 git 配置和最新的“做事方式”理念。
    • 检查并采用针对目标机器的操作系统配置和最新的“做事方式”理念。

    【讨论】:

      【解决方案6】:

      IMO 的正确答案是 git clone --mirror。这将完全备份您的存储库。

      Git clone mirror 会克隆整个仓库、notes、heads、refs 等,通常用于将整个仓库复制到新的 git 服务器。 这将拉下所有分支并一切,整个存储库。

      git clone --mirror git@example.com/your-repo.git
      
      • 通常克隆 repo 不包括所有分支,只包括 Master。

      • 复制 repo 文件夹只会“复制”已被 拉进来......所以默认情况下只有主分支或其他 您之前签出的分支。

      • Git 捆绑命令也不是您想要的:“捆绑命令 将打包通常会被推过的所有东西 将 git push 命令连接到一个二进制文件中,您可以通过电子邮件发送到该文件 某人或放在闪存驱动器上,然后解绑到另一个存储库中。”(来自What's the difference between git clone --mirror and git clone --bare

      【讨论】:

      • git clone --mirror 是否创建一致的时间点备份?什么是用户在备份期间推送提交?它是否被拒绝、排队或合并到备份中?
      【解决方案7】:

      所有内容都包含在.git 目录中。只需像备份任何文件一样将其与您的项目一起备份即可。

      【讨论】:

      • 这是否意味着,只需备份包含 Git 项目的目录的所有内容就足够了?
      • 同意 Sunil——这似乎不是原子操作。
      • 如何确保在创建备份时不会更改该目录中的文件?
      • 正如 Raedwald 所暗示的,这种方法可能会导致备份不一致,从而导致数据丢失。因此,这个答案应该被删除,或者至少,警告数据丢失的可能性。
      • 我认为他非常了解copycp 命令,但这并不适合他的需要。而且我也觉得,他是在裸仓库上思考的(虽然也可以复制,但我觉得不是全功能的备份)。
      【解决方案8】:

      使用 git 包,或克隆

      复制 git 目录不是一个好的解决方案,因为它不是原子的。如果你有一个大的仓库需要很长时间来复制,并且有人推送到你的仓库,它会影响你的备份。克隆或制作捆绑包不会有这个问题。

      【讨论】:

        【解决方案9】:

        您可以使用git-copy 以最小存储大小备份 git 存储库。

        git copy /path/to/project /backup/project.repo.backup
        

        然后你可以用git clone恢复你的项目

        git clone /backup/project.repo.backup project
        

        【讨论】:

        • github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36:对于一个简单的git clone --bare + git push --force 来说,这似乎需要做很多工作。
        • @VonC 是的,但是它可以在重新打包过程中具有一些额外的功能,或者它可以挖掘 git repo 的内部结构,它可以用于一些优化(重组目的地,或速度增加等)。
        【解决方案10】:
        cd /path/to/backupdir/
        git clone /path/to/repo
        cd /path/to/repo
        git remote add backup /path/to/backupdir
        git push --set-upstream backup master
        

        这会创建一个备份并进行设置,以便您可以执行 git push 来更新您的备份,这可能是您想要做的。只要确保 /path/to/backupdir 和 /path/to/repo 至少是不同的硬盘驱动器,否则这样做没有多大意义。

        【讨论】:

        • 我觉得他很了解克隆命令,如果他能提出这样的问题,显然对他来说是不够的(因为它是克隆,而不是转储)。转储是与简单副本不同的东西,例如:1)它们不需要是正常工作的最佳(或什至有能力)2)但它们需要具有良好的抵抗力和可修复性以防止数据损坏 3)它通常很有用如果它们对于增量备份很容易区分,而对于副本来说这不是一个目标。
        【解决方案11】:

        这里有两个选项:

        1. 您可以直接获取 git repo 目录的 tar,因为它具有服务器上 repo 的全部裸露内容。有人在进行备份时可能正在处理 repo。

        2. 以下命令将为您提供 repo 的裸克隆(就像它在服务器中一样),然后您可以毫无问题地获取克隆位置的 tar。

          git clone --bare {your backup local repo} {new location where you want to clone}
          

        【讨论】:

        • 我认为他很了解clone或tar命令,如果他能提出这样的问题,显然对他来说是不够的(因为它是克隆,而不是转储)。转储是与简单副本不同的东西,例如:1)它们不需要是正常工作的最佳(或什至有能力)2)但它们需要具有良好的抵抗力和可修复性以防止数据损坏 3)它通常很有用如果它们对于增量备份很容易区分,而对于副本来说这不是一个目标。
        • peterh,他绝对不是要 tar 或 clone 命令。如果您仔细观察,我也没有解释这些命令。我试图解释的是通过不同方法进行的 Git 备份,其中可能包括各种 Linux 命令,这并不意味着我正在教那些 linux 命令。我想在这里提出一些想法。
        【解决方案12】:

        如果它在 Github 上,请导航到 bitbucket 并使用“导入存储库”方法将您的 github 存储库作为私有存储库导入。

        如果它在 bitbucket 中,则反之。

        这是一个完整的备份,但保留在云中,这是我的理想方法。

        【讨论】:

          【解决方案13】:

          据我所知,你可以复制你的仓库所在的目录,就是这样!

          cp -r project project-backup
          

          【讨论】:

          • 有人可以确认一下吗?我觉得这是进行适当备份的正确方法。
          • 我认为在复制操作期间将更改提交/推送到存储库时,您最终可能会得到不一致的快照。使用像 git clone --bare 这样的 git 命令会给你一个一致的快照。
          • 同意 Sunil——这似乎不是原子的。
          • @jia103 如果它不是原子的,这并不总是一个问题 - 你只需要知道并且需要能够保证在你处理它时没有其他人可以访问它。但我认为 OP 想要一个特定的、针对 git repos 任务优化的工具,简单的文件复制可能对他来说是众所周知的。
          • 定期cping git repoes 是对您存储设备的滥用。
          猜你喜欢
          • 1970-01-01
          • 2019-11-16
          • 2021-06-11
          • 1970-01-01
          • 2011-06-07
          • 2012-05-22
          • 2011-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多