使用git作为实时镜像

时间:2010-09-17 23:55:53

标签: svn git rsync mirroring

我有本地机器(A),测试服务器(B)和存储库服务器(C) 我有以下工作流程:

  1. 在A
  2. 上编码
  3. 镜像更改为测试机器B
  4. 如果效果很好从B到C
  5. 现在,我使用rsync进行镜像,但是由于存储库增长,从B获取文件列表需要一些时间(约10秒)。我想使用Git而不是rsync,因为它会更快,我会拥有本地历史以及存储库C.

    问题是我没有找到任何方法使用git live -mirroring。我能做到

    git add . && git commit -m "mirroring" && git push
    

    在本地机器上,但服务器呢?

    每隔几秒就有一次cronjob

    git checkout | awk '{print $2;}' | git checkout
    

    正确的方法?

    P上。 S。:我是git的新手,也许还有更适合这项工作的工具。

3 个答案:

答案 0 :(得分:1)

使用Git进行实时镜像可以通过git hooks完成。

您可以设置update挂钩,可以在更新分支后执行操作严格。在服务器B上设置此挂钩。每次推送更改时,挂钩将在B的站点上启动。在这个钩子中,您可以将更改推送到C(您应该为其创建一个遥控器)。钩子看起来像这样:

#!/bin/bash
git push remote-of-c $3:$1
[ $? -ne 0 ] && { 
  echo 'Mirroring failed, check server settings and try again.'
  exit 1
}

因此,每次更新B时,C也会更新。如果在推送期间出现故障,您将在控制台中看到相关消息,并且您的初始推送将不会成功。这就是所谓的“镜像”,不是吗?

答案 1 :(得分:0)

使用正确的工具来完成正确的工作。我会使用unison或类似的东西来做镜像。

我也会从A而不是B提交。因此,您可以跳过在测试环境中镜像.git目录,这会使它更快。然后,您可以留下更有意义的提交消息,了解更改内容和原因...而不是看到无限的“镜像”消息列表。

答案 2 :(得分:-1)

我不认为镜像工具应该是必要的,git似乎是完美的。 正如fseto所说,我还建议提交A.将您的更改复制到C应该使用git push完成。然后,你需要了解的是,由于B有一个工作树,推到它绝对不是要走的路。您(至少应该)只能推送到存储库(没有工作树的存储库:服务器C上应该有什么)。

相反,在B上,您可以从A中获取更改(B是A的git clone。当然,这可以在cronjob上设置。这几乎是git pull,除非你想要始终反映来自服务器A的HEAD,即使你在A上的分支之间切换,删除提交,分支等等。所以,在B,我会选择以下命令:

git fetch origin ; git checkout origin/HEAD

此命令将警告您,因为它将创建一个“分离的HEAD”状态,但这很好,因为您不想在B上提交。

最后,服务器部分:

  1. 在C上:按git init --bare
  2. 创建服务器仓库
  3. 在B(或A?)上:将您的服务器添加为远程:git remote add server <repo-C>
  4. 在B(或A?)上:如果一切正常,请将更改推送到服务器,例如:git push server HEAD:master。我正在写HEAD作为一般,但你可能想要使用分支。
  5. 希望我的解释是可以理解的......:)