完全备份一个 Git 回购?

有没有一种简单的方法来备份包含所有分支和标记的整个 git 回购?

157504 次浏览

所有内容都包含在 .git目录中。只要将它与您的项目一起备份,就像您将任何文件一样。

git bundle

我喜欢这个方法,因为它的结果只有 文件,更容易复制左右。
参见 快乐的小宝贝
另见“ 我怎样才能给某人发送 git 存储库的电子邮件?”,其中的命令

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

详情如下:

git bundle将只包含由 一个 href = “ http://www.kernel.org/pub/software/scm/git/docs/git-show-ref.html”rel = “ noReferrer”> git show-ref 显示的引用: 包括磁头、标签和远程磁头。
目的地所持有的基础是非常重要的。
为了谨慎起见,可以犯一些错误,这会导致 bundle 文件包含目标文件中已经存在的对象,因为在目标文件中解包时会忽略这些对象。


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

git clone /tmp/foo-all newFolder

据我所知,你只要复制一份你的回购目录,就可以了!

cp -r project project-backup

直接复制一个怎么样?

git clone --mirror other/repo.git

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

使用 git bundle,或者克隆

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

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

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

然后,当您想要从克隆位置刷新备份: git remote update时。

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

这是原子性的,所以不会出现简单拷贝会出现的问题。

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

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 至少是不同的硬盘驱动器,否则这样做没有多大意义。

您可以在最小存储大小下使用 收到备份 git 回购。

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

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

git clone /backup/project.repo.backup project

这里有两个选择:

  1. 您可以直接获取 git repo 目录的 沥青,因为它包含服务器上 repo 的全部内容。有一个轻微的可能性,有人可能正在工作的回购,而采取备份。

  2. 下面的命令将为您提供 repo 的完全克隆(就像在服务器中一样) ,然后您可以获取您已经克隆的位置的 tar,没有任何问题。

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

正确答案 IMO 是 基特克隆,镜子。这将完全备份您的回购。

Git 克隆镜像将克隆整个存储库、注释、标题、参考文献等,通常用于将整个存储库复制到新的 Git 服务器。这将下拉一个所有的分支和所有的东西,即 整个存储库。

git clone --mirror git@example.com/your-repo.git
  • 正常情况下,克隆一个回购并不包括所有的分支,只包括 Master。

  • 复制回购文件夹只会“复制”已经存在的分支 拉进来... 所以默认情况下,这是主分支或其他 您以前已经签出的分支机构

  • Git bundle 命令也不是您想要的: “ The bundle command 将包装一切,通常会推到 使用 git push 命令连接到一个二进制文件,您可以通过电子邮件发送到该文件 某人或者放在一个闪存驱动器上,然后将其解包到另一个存储库中。”

金康脆VonC拓展大答案

我把两者结合起来:

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只复制导致存储库中某些引用(分支或标记)的提交。因此,纠缠提交不存储到捆绑包中。

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

如果是在 bitbucket 里,反过来做。

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

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

所以从回答最初的问题开始:

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

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

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

1. 什么是“完整的”git 回购备份?

关于什么是“100%”备份,观点不同。

# 1开发者的观点

  • 内容
  • 参考文献

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

# 2管理员的观点

  • 内容文件
    • 特殊情况下的“ packfile”: git 在垃圾收集期间将对象组合并压缩到 packfiles 中(参见 git gc)
  • Git 配置
  • 可选: OS 配置(文件系统权限等)

Git 是一个开发人员工具,并将其留给管理员。 Git 配置和 OS 配置的备份应该与内容的备份分开。

2. 技巧

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

3. 其他需要考虑的问题

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

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

Git 为备份内容提供了什么

  • git gc --auto

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

    • 文件: 男人 git-bundle,男人 git-rev-list
    • 原子 = “热拷贝”
    • 捆绑包是转储文件,可以直接与 git 一起使用(验证、克隆等)。
    • 支持增量提取。
    • 通过 git bundle verify验证。
  • git clone --mirror

    • 文件: 人类基特克隆,人类基特 FSCK,什么是 git 克隆之间的区别-镜像和 git 克隆-裸
    • 原子 = “热拷贝”
    • 镜像是真正的 Git 存储库。
    • 该命令的主要目的是构建一个完整的活动镜像,该镜像定期从原始存储库获取更新。
    • 支持同一文件系统上镜像的硬链接,以避免浪费空间。
    • 通过 git fsck验证。
    • 镜像可以用作完整文件备份脚本的基础。

5. 冷收到

一个冷拷贝备份总是可以做一个完整的文件备份: 拒绝 所有访问 git 回购协议,做备份并允许再次访问。

  • 可能出现的问题
    • 可能不容易甚至不可能拒绝所有访问,例如通过文件系统共享访问。
    • 即使回购是在只有一个用户的客户端机器上,那么用户仍然可以在自动备份运行期间提交一些东西: (
    • 在服务器上停机可能是不可接受的,并且备份多个巨大的回购协议可能需要很长的时间。
  • 缓解建议:
    • 一般来说,即使客户端在同一台机器上,也不要通过文件系统直接进行回购访问。
    • 对于 SSH/HTTP 访问,使用 git 授权管理器(例如,gitolite)以脚本方式动态管理访问或修改身份验证文件。
    • 备份回购一个接一个,以减少停机时间为每个回购。拒绝一次回购,进行备份并再次允许访问,然后继续进行下一次回购。
    • 有计划的维护时间表,以避免开发人员的心烦意乱。
    • 只有在存储库发生更改时才进行备份。可能很难实现,比如对象列表加上包文件,配置和钩子的校验和等等。

6. 热-收到

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

“100% 管理”热拷贝备份

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

7. 修复

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

中有一个非常简单的 Python 工具,可以自动备份组织的存储库。通过保存公共和私有存储库及其所有分支来实现 zip 格式。它与 Github API: https://github.com/BuyWithCrypto/OneGitBackup一起工作