1

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

  1. 在 A 上编码一些东西
  2. 将更改镜像到测试机器 B
  3. 如果它运作良好,从 B 提交到 C

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

问题是我还没有找到任何方法来使用 git进行实时镜像。我可以

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

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

是每隔几秒 cronjob

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

正确的方法?

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

4

3 回答 3

1

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

您可以设置钩子,它可以在更新分支后update执行操作。在服务器 B 上设置此挂钩。每次您向其推送更改时,该挂钩都会's 站点启动。在这个钩子中,您可以将更改推送到(您应该为其创建一个远程)。钩子看起来像这样:BC

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

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

于 2010-09-18T07:24:47.553 回答
0

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

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

于 2010-09-18T00:25:15.440 回答
-1

我认为不需要镜像工具,git 似乎非常适合。正如 fseto 所说,我还建议在 A 上提交。将您的更改复制到 C 应该使用git push. 然后,您需要了解的是,由于 B 有一个工作树,因此推送它绝对不是要走的路。您可以(至少,应该)只推送到存储库(没有工作树的存储库:您应该在服务器 C 上拥有的东西)。

相反,在 B 上,您可以从 A 获取更改(B 是git cloneA 的一个)。当然,这可以在 cronjob 上设置。这几乎是 a git pull,除了您希望始终反映HEAD来自服务器 A 的内容,即使您在 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 是为了笼统,但您可能想改用分支。

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

于 2010-09-18T07:11:50.827 回答