【问题标题】:Mirror a git repository by pulling?通过拉取镜像 git 存储库?
【发布时间】:2011-02-14 22:50:18
【问题描述】:

我想知道是否有一种简单的方法,例如简单的 cron 作业,定期从远程 git 存储库到本地只读镜像以进行备份?

理想情况下,它会拉出所有分支和标签,但 master/trunk/head 就足够了。

我只需要一种方法来确保如果主 git 服务器死了,我们有一个可以手动故障转移到的备份位置。

【问题讨论】:

  • bash 脚本的想法有什么问题?您可以将其修改为只进行一次探测/拉动,然后将其安装为 cron 作业,不是吗?
  • 那个脚本没问题。你知道每一个 git repo 的克隆都是一个完整的备份吗?因此,您很可能已经拥有大量的 repo 副本。
  • @Andrew,说得好。在我们的情况下,尽管我们有任何地方都没有克隆的示例,即我们有一些由客户端通过 FTP 更新的代码。我们使用 git 来跟踪客户端在做什么,并且在任何地方都没有它的克隆。
  • 仅作记录,git clone 不是完整的备份。它不包括 .git/config 中的存储库配置,也不包括 reflog、钩子、git-rerere 的缓存或未引用的提交(这也可能很有价值)。大概还有很多其他的东西在 .git/ 中。对于备份服务器存储库,一个克隆可能就足够了,但一个工作存储库有很多损失。

标签: git mirror


【解决方案1】:

首先用

创建一个镜像
git clone --mirror git@somewhere.com:repo.git

然后像这样设置一个 cron 作业:

*/1 * * * * gitbackup cd /backup/repo.git && git fetch -q --tags

这将每分钟备份一次变更集。也许您想减少执行此操作的频率。

【讨论】:

  • 那太好了。我知道会有一个简单的答案! (我是如此接近)
  • 什么是 gitbackup?我找不到这样的命令(谷歌也找不到)。
  • @ihor-kaharlichenko 在系统 crontab 中(/etc 中的那个)这是一个运行作业的用户帐户。
  • @Sc0rian 正如@Zart 解释的那样:gitbackup 是用户。
【解决方案2】:

您可以直接访问服务器吗?那么你可以只 rsync .git 目录

【讨论】:

  • 取决于平台,简单地复制 git repo 可能会导致问题,例如由于权限未从源传播到目标。因此,克隆是一个更好的解决方案,因此这个答案是 -1。
  • rsync 可以解决这个问题。此外,我经常发现 pull 不会提取遥控器、存储和其他重要信息
  • 我真的不明白这个答案是如何这么糟糕?也许这不是最好的解决方案,但如果您可以直接访问服务器,它绝对是一个可行的解决方案。如果您直接 rsync 到 tar 存档,您甚至不会遇到权限问题……
  • 怎么样:不是那么安全?它现在可能有效,但这是偶然的;谁来保证一年后它会起作用?
  • @chila: 为什么它更优秀?使用 Git 备份存储库不会复制所有内容,而只会复制可从 refs 访问的提交(没有悬空提交、树和 blob)。使用 rsync 可以获得所有内容,可以在文件系统级别访问。是的,使用 Git 可能会传输更少的数据,并且 rsync 将在重新打包存储库后复制完整的包文件。但是使用 rsync 你会得到一个精确的副本(备份)。无论如何,我真的不在乎反对票,我坚持我的回答
【解决方案3】:

正如 Andrew 所指出的,git repo 的每个克隆都是 repo 的完整备份。也就是说,如果您想要将某些内容自动备份到特定机器上,您可以在备份服务器上创建一个裸仓库,将您想要备份的所有分支推入其中,以便最初填充它。然后只需在“主”存储库上设置一个更新后挂钩,以便一旦有提交被推送,它就会继续并将它们推送到备份存储库。无需 cron 作业或 rsync,它几乎是实时副本。

【讨论】:

  • +1 用于添加一个总体上很好(因此是一个很好的参考)但不回答问题的解决方案。我们正在询问如何拉动,因为我们需要通过 NAT 拉动
猜你喜欢
  • 2015-07-16
  • 2012-08-14
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多