在2个git存储库之间同步

时间:2011-04-05 13:47:19

标签: git git-merge git-pull git-fetch

我有2个裸存储库。它们是这样的:

ssh git@primary.com
git init --bare repo1
ssh git@backup.com
git clone --bare git@primary.com:repo1

一个用于发展(让我们称之为的)和一个用于备份(在第一情况下是不可访问)。是否可以自动同步它们 - 比如在备份时执行git pull

我猜你不能合并或拉上裸存储库。是否有其他方法可以使备份存储库保持最新状态,而不是:

ssh git@backup.com
rm repo1 -fr
git clone -- bare git@primary.com:repo1

当然,当主服务器暂时无法访问时,我使用了备份,然后我想更新主服务器。

另外加入2个遥控器来工作存储库是一个解决方案,但你必须不断推到它们两者,这是不可能发生的,如果一个是不可访问的。

所有冲突都在非裸存储库中解决

编辑为什么我需要备份存储库:

我们使用远程存储库来交换代码,并且每天都需要它。通常人们不需要其他开发人员编写的代码,但情况并非总是如此。我们与小学失去了3天的联系,这并不容易发展。我在另一台服务器上创建了第二个存储库并且我克隆了本地,但是我必须为很多项目执行此操作并且耗时。我更喜欢自动更新第二个存储库。

2 个答案:

答案 0 :(得分:3)

您可以使用git push --mirror other-remote将一个存储库中的所有引用镜像到另一个存储库。但是,这不会镜像存储库配置或存储 - 您可能还想查看此问题的答案:


更新:在回答您在下面澄清的问题和评论时,我应该说git push --mirror在两个方向都不安全,因为git push --mirror执行了{{3} }}。例如,假设master上的primarybackup上的primary更早,git push --mirror上有一个尚未镜像的新分支 - 那么{{1}将master上的primary分支重置为旧状态并删除新创建的分支。

此外,即使您只是从primary镜像到backup,也不允许人们推送到backup,因为任何新的推送到那里都会是被下一面镜子移走。

那么,你能做什么?我假设当主存储库不可用时,整个机器不可用。因此,在备份服务器上,我会创建一个裸存储库,如您所建议的那样,主存储器上的cron作业将镜像存储库。但是,您不应该允许人们推送到该镜像存储库 - 当主服务器出现故障时,克隆镜像以创建一个人们可以推送到同一时间的裸存储库。备份主服务器时,阻止人们推送到备份上的新存储库,然后在本地合并更改,并将新工作推送回主服务器。

答案 1 :(得分:0)

使用crontab脚本或类似程序定期运行git push --mirror remote到您的备份。您还可以添加一个提交挂钩,以便在更新时自动强制推送到另一个远程,这样您就没有“失败窗口”。无需从备份更新,因为它可能永远不会有任何新的或更新的内容。