【问题标题】:synchronize between 2 git repositories在 2 个 git 存储库之间同步
【发布时间】:2011-07-30 00:01:31
【问题描述】:

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

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

一个用于开发(我们称之为primary),一个用于备份(以防第一个无法访问)。是否可以自动同步它们——比如在备份时做git pull

我猜你不能合并或拉入裸存储库。是否有另一种方法可以使备份存储库保持最新状态,而不是这样:

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

当然,当有一段时间无法访问主节点并且我使用备份时,我会想要更新主节点。

另外,将 2 个遥控器添加到工作存储库是一种解决方案,但您必须不断向它们推送,如果其中一个无法访问,则不会发生这种情况。

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

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

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

【问题讨论】:

  • 只是一个简短的建议(不是一个完整的解决方案):您可以在“主要”上使用提交后挂钩将更改推送到“备份”,而不是从那里拉出来。但是,我没有看到“备份”存储库的原因,因为这最初是使用分布式 vcs 的原因:每个克隆都是备份。

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


【解决方案1】:

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


更新:为了回应您在下面澄清的问题和评论,我应该说git push --mirror 在两个方向上都不安全,因为git push --mirror 做了forced update of refs and removes deleted refs。例如,假设您在primary 上的master 领先于backup,并且primary 上有一个尚未镜像的新分支 - 那么git push --mirror 将重置master 分支primary 到旧状态并删除新创建的分支。

此外,即使您只是从primary 镜像到backup,让人们推送到backup 也是不安全的,因为任何新推送到那里的东西都会被下一个镜像删除。

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

【讨论】:

  • 我试过了。由于备份有一些新的提交,我收到了! [remote rejected] origin/HEAD (inconsistent aliased update) 消息。我从备份中尝试了git push --mirror primary,它成功了。之后一切正常。我的问题是,当有些可能不是最新的时,从双方git push --mirror 是否完全安全。
  • 那很糟糕。我想要半自动同步,但我想如果你在同一个分支中推送两个 repos 不同的东西是不可能的。在我接受答案之前,我会等待其他答案,我会做一些测试。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2011-06-19
    • 2020-12-06
    相关资源
    最近更新 更多