【问题标题】:Use git as live mirror使用 git 作为实时镜像
【发布时间】:2024-04-29 14:05:02
【问题描述】:

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

  1. 在 A 上写代码
  2. 将更改镜像到测试机器 B
  3. 如果运行良好,从 B 提交到 C

目前,我使用 rsync 进行镜像,但由于存储库增长,从 B 获取文件列表需要一些时间(约 10 秒)。我想使用 Git 而不是 rsync,因为它会更快,我会与存储库 C 一起具有本地历史记录。

问题是我还没有找到任何方法来做 live - 用 git 镜像。我可以的

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

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

每隔几秒就做一次 cronjob

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

正确的方法?

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

【问题讨论】:

    标签: svn git rsync mirroring


    【解决方案1】:

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

    你可以设置update钩子,它可以在分支更新后执行动作rigt。在服务器 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
    }
    

    所以每次更新BC 也会更新。如果在推送过程中出现问题,您将在控制台中看到相关消息,并且您的初始推送不会成功。这就是所谓的“镜像”吧?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我认为不需要镜像工具,git 似乎非常适合。 正如 fseto 所说,我还建议在 A 上提交。应该使用 git push 将您的更改复制到 C。然后,您需要了解的是,由于 B 有一个工作树,因此推送它绝对不是要走的路。您可以(至少,应该)只推送到 bare 存储库(没有工作树的存储库:您应该在服务器 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. 在 B(或 A?)上:将您的服务器添加为远程服务器:git remote add server <repo-C>
        3. 在 B(或 A?)上:如果一切正常,请将您的更改推送到服务器,例如:git push server HEAD:master。我写 HEAD 是为了笼统,但您可能想改用分支。

        希望我的解释是可以理解的... :)

        【讨论】:

          最近更新 更多