我有本地机器(A),测试服务器(B)和存储库服务器(C) 我有以下工作流程:
现在,我使用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的新手,也许还有更适合这项工作的工具。
答案 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上提交。
最后,服务器部分:
git init --bare
git remote add server <repo-C>
git push server HEAD:master
。我正在写HEAD作为一般,但你可能想要使用分支。希望我的解释是可以理解的......:)