如何为Git存储库组织和设置镜像备份服务器?

如何为Git存储库组织和设置镜像备份服务器?,git,Git,我正在将一些svn存储库迁移到Git。所以,我基本上想做的是: 设置一个带有裸Git存储库的服务器,我将从中拉入并推送到 为第一台服务器上的所有存储库设置几个备份服务器 所以,假设我的服务器上有一个目录,比如:$HOME/git/,它有空的存储库。例如: ~/git/project1.git ~/git/project2.git ~/git/project3.git ... 我的备份服务器可能是此服务器的镜像,或者将备份的数据保存在存档中或其他任何位置。我想我可以这样做: git clon

我正在将一些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
然后将所有项目中的所有捆绑包复制到我的备份服务器。
然而,无论采用哪种策略,拥有大量项目都是一项乏味的任务,因此在每种情况下,我都需要编写一些脚本来自动化任务


我想知道你们是怎么做到的?也许有比我已经考虑过的更好的方法。任何提示都将不胜感激。

这里似乎没有什么特别之处——您只需要一个标准的备份解决方案


我在rsnapshot或rsync方面运气不错,如果我只需要简单的备份。

总体思路是:

  • 在备份服务器上创建裸repo
  • 在您的主裸Git存储库上(可能有一个)自动将接收到的任何内容推送到相应的Git备份repo,或者通过
还有其他基于的技术,但想法仍然是一样的


post接收挂钩示例:

  • 发件人:
#!/垃圾箱/垃圾箱 # #一个钩子脚本,在成功的 #作出承诺。 # #将此文件放在.git/hooks和chmod+x中 BRANCH=`git BRANCH--no color 2>/dev/null | sed-e'/^[^*]/d'-e's/*\(.*)/\1/'` git推送源$分支
  • (红宝石色)
#!/usr/bin/env ruby STDIN.read.split(“\n”)。每个do |行| oldrev、newrev、refname=line.split(“”) 如果refname.match(/^refs\/heads\/(.*)/) 分行=1美元 `git推送原点#{branch}` 其他的 放置“#{refname}很奇怪,不知道该怎么办。” 结束 结束
我想你可能会更了解serverfault.com这个钩子只推一个分支,它在存储库中是最新的。在我的例子中,我需要备份所有现有的分支,所以它是这样的:
git push origin
,并且没有分支变量。@AndersMetnik的链接在8到10年之间,我一点也不奇怪;)无论如何,我已经恢复了所有链接。 #!/bin/sh # # A hook script that is called after a successful # commit is made. # # Place this file in .git/hooks and 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