如何组织和设置镜像备份服务器以备份Git仓库?

3
我正在将一些svn仓库移动到Git。所以,我基本上要做的是:
  • 设置一个服务器,其中包含裸Git仓库,我将从中拉取和推送
  • 为所有位于第一个服务器上的存储库设置几个备份服务器。
因此,假设我在服务器上有一个目录,例如:$HOME/git/,其中包含裸仓库。例如:
~/git/project1.git
~/git/project2.git
~/git/project3.git
...

我的备份服务器可以作为这个服务器的镜像,或将备份数据存储在归档中。我想我可以这样做:

git clone --bare ssh://gitserver/~user/git/projectX.git

也许是这样:
$ cd ~/git/project1.git
$ git bundle create ~/gitbackup/project1.bdl --all

然后将所有项目的bundles复制到我的备份服务器。
然而,对于有很多项目的情况,这两种策略都是一项繁琐的任务,所以在每种情况下,我都需要编写一些脚本来自动化这个任务。

我想知道你们是如何处理这个问题的?也许有比我已经考虑过的更好的方法。任何提示都将不胜感激。


我认为你可能会在serverfault.com上获得更好的信息。 - Toby Allen
2个回答

5
一般的想法是: 还有其他技术 在2008年, 基于 gibak, 但思路保持不变。

一个 post-receive 钩子的示例:

    #!/bin/sh
    #
    # 在提交成功后调用的钩子脚本。
    #
    # 将此文件放置在 .git/hooks 中并 chmod +x
BRANCH=`git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'` git push origin $BRANCH
#!/usr/bin/env ruby STDIN.read.split("\n").each do |line| oldrev, newrev, refname = line.split(' ')
if refname.match(/^refs\/heads\/(.*)/) branch = $1
`git push origin #{branch}` else puts "#{refname} was weird, not sure what to do." end end
这段代码是用Ruby编写的,它会读取标准输入并将其拆分为行。然后它会检查引用名称是否匹配特定模式(以"refs/heads/"开头),如果是,则将分支名称提取出来,并使用git命令将该分支推送到远程仓库。如果引用名称不匹配模式,则输出一条消息表示不确定该怎么处理。

这个钩子只推送当前存储库中的一个分支。在我的情况下,我需要备份所有现有的分支,所以它是这样的:git push origin,没有BRANCH变量。 - Ivan Kurmanov
1
@AndersMetnik,链接已经有8到10年的历史了,我并不感到惊讶 ;) 无论如何,我已经恢复了所有链接。 - VonC

2

这里似乎没有什么特别的 -- 你只需要一个标准的备份解决方案。

我在使用rsnapshot时运气很好,如果我只需要简单的备份,我会使用rsync。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接