完全备份git repo?

时间:2011-04-07 08:39:58

标签: git backup

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

13 个答案:

答案 0 :(得分:163)

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仓库之外):

git clone /tmp/foo-all newFolder

答案 1 :(得分:52)

什么只是克隆它?

git clone --mirror other/repo.git

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

答案 2 :(得分:20)

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

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

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

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

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

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

答案 3 :(得分:7)

通过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仅复制导致在存储库中产生某些引用(分支或标记)的提交。因此,纠结提交不会存储到分发包中。

答案 4 :(得分:4)

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

答案 5 :(得分:4)

使用git bundle或clone

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

答案 6 :(得分:4)

该线程对获取如何完成git repos备份很有帮助。我认为它仍然缺少一些提示,信息或结论来寻找适合自己的“正确方法”(tm)。因此,在这里分享我的想法可以帮助他人,并提出讨论以增强他们的见识。谢谢。

因此,从提起原始问题开始:

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

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

  • 通过“热拷贝”进行备份是首选,以避免服务停机。
  • git的缺点将通过其他命令解决。
  • 脚本应执行备份,以将多个步骤组合为一个备份,并避免人为错误(打字错误等)。
  • 另外,脚本应执行还原以使转储适应目标计算机,例如自备份以来,甚至原始计算机的配置也可能已更改。
  • 环境是Linux计算机上的git服务器,其文件系统支持硬链接。

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

对于什么是“ 100%”备份,观点有所不同。这是两个典型的例子。

#1开发人员的观点

  • 内容
  • 参考

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

#2管理员的观点

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

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

2。技术

  • “冷复制”
    • 停止该服务以对其文件具有独占访问权。停机!
  • “热复制”
    • 服务提供了用于备份目的的固定状态。正在进行的更改不会影响该状态。

3。其他要考虑的主题

其中大多数是备份通用的。

  • 是否有足够的空间来容纳完整备份?将存储几代?
  • 是否需要增量方法?将存储几代,以及何时再次创建完整备份?
  • 如何验证备份在创建后或一段时间后是否未损坏?
  • 文件系统是否支持硬链接?
  • 将备份放到单个存档文件中还是使用目录结构?

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

  • git gc --auto

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

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

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

5。冷复制

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

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

6。热复制

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

“ 100%管理员”热拷贝备份

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

7。恢复

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

答案 7 :(得分:3)

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

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

然后,您可以使用git clone

恢复项目
git clone /backup/project.repo.backup project

答案 8 :(得分:2)

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

Git克隆镜像将克隆整个存储库,注释,磁头,引用等,通常用于将整个存储库复制到新的git服务器。这将拉下所有分支和一切, 整个 存储库。

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

  • 复制repo文件夹只会“复制”已经分支的分支 拉入...所以默认情况下只有Master分支或其他 你之前签出过的分店。

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

以下是两个选项:

  1. 您可以直接获取git repo目录的 tar ,因为它在服务器上拥有repo的全部内容。有人可能会在备份时处理回购。

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

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

答案 11 :(得分:0)

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

如果它在bitbucket中,请反之。

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

答案 12 :(得分:-7)

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

cp -r project project-backup