在Git中远程跟踪当前分支

时间:2009-11-23 04:47:30

标签: git tdd continuous-integration cruisecontrol.rb

我正在将我的连续测试移到专用服务器上(自动测试会使我的本地笔记本电脑变得太慢)。我想要的是我的测试服务器(恰好运行CruiseControl.rb)通过Git不断获取我最新的(提交的)更改 - 理想情况下,我自己的工作流程没有任何变化。我是这个项目的唯一开发人员。

在获得测试服务器之前,我有:

  • 我的笔记本电脑是我的主要开发系统
  • 我本地存储库中的多个分支。
  • 指向其中一个分支的本地工作副本。我经常在分支之间切换(通常用于新功能)。
  • 一个GitHub帐户,我经常将本地分支推送到镜像远程分支。 (这主要是为了使用异地备份;我没有为我当前的项目共享任何代码)。我尝试至少在每个工作日结束时推送到GitHub,尽管我偶尔会忘记。

我想保持所有这一切。最重要的是,我现在有:

  • 测试服务器
  • ...正在运行CruiseControl.rb
  • 我的测试服务器上的笔记本电脑存储库的克隆。 (目前它不是克隆GitHub)
  • 测试服务器上的本地工作副本,CC正在构建/测试。
  • 此工作副本指向一个特定的Git分支(当然)

我一直在尝试让我的测试服务器自动获取我在笔记本电脑工作副本上工作的任何分支并从中构建。 (这将模仿自动测试的连续测试而不占用系统资源)。

我尝试过的事情没有成功:

  • git checkout origin / HEAD:这会使文件正常但会破坏CruiseControl,因为它不喜欢“无分支”的工作副本。
  • git checkout --track -b a_branch origin / a_branch:这适用于获取文件,CC喜欢它,但它将测试服务器粘贴到特定分支。当在笔记本电脑上切换分支时,我将有效地停止测试我当前的工作。
  • git checkout --track -b my_testing_branch origin / HEAD:这也获得了可构建的文件,但它遇到了与上面命令相同的问题。从origin / HEAD创建分支只获取“默认”分支的HEAD,因此它也是粘性的。

有什么方法可以让我的远程连续测试系统(有或没有git分支)不会对我的工作流程产生重大变化吗?

6 个答案:

答案 0 :(得分:3)

另一个选择是编写一个hook,通知测试服务器要提取的新代码。特别是,post-commit钩子可能是更好的路线。然后,每次提交时,都可以通知测试服务器要从哪个分支拉出来。

答案 1 :(得分:1)

您可以拥有一个专门的测试分支,您可以在其上合并当前的分支工作 您可以使用当前工作分支的提交强制替换该分支的内容(请参阅git merge -s ours, what about “their” 问题)。

然后在CI服务器上,使用以下命令对其进行初始化:

 $ git fetch laptopRepo
 $ git checkout -b testingBranch laptopRepo/testingBranch

这意味着笔记本电脑方面的第一步是发布一些当前要测试的作品。

答案 2 :(得分:1)

这不是最好的解决方案,但它是......

测试服务器可以运行git remote show origin以查看笔记本电脑上当前处于活动状态的分支。例如,

$ git remote show origin
* remote origin
  Fetch URL: blade:/var/scratch/code
  Push  URL: blade:/var/scratch/code
  HEAD branch: foo
  Remote branches:
    foo tracked
    bar tracked
    qux tracked

因此,原始存储库当前位于foo分支上。

我没有看到一个低级别的命令会直接提供给你,所以你可能需要从中解析它(也许有人会有更好的方法)。例如,

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ echo $b
foo

现在,由于origin/foo的行为类似于origin/HEAD(没有本地分支),而你的CruiseControl不喜欢你应该只在测试机器上创建一个本地分支并简单地重置它到最新的位置:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ git reset --hard origin/$b

注意,这有点脆弱,因为HEAD我并不总是你认为的那样。例如,在rebase期间HEAD将向后和向前移动。如果您的测试服务器在rebase期间检查笔记本电脑上的HEAD,则可能会出现一些无效或不受欢迎的位置。

答案 3 :(得分:1)

我认为通过颠倒两个系统之间的关系可以得到一个很好的解决方案。我没有让测试服务器从笔记本电脑的存储库中取出,而是可以将笔记本电脑推送到服务器进行测试。

首先,我在笔记本电脑的回购中添加一个遥控器:

git remote add testing <url of testing server>

然后,每当我有测试代码时,我都会推送:

git push -f testing HEAD:master

这将适用于我目前所处的任何分支。 -f确保我会吹掉那个分支中已有的东西;我不必担心任何祖先。

这实际上并不会将最新的代码放在工作副本中,但CruiseControl的轮询可以解决这个问题。我还可以有一个服务器端钩子来更新工作副本运行测试套件(我当时甚至不需要CC)。

我可能想要将一个组合的commit + push命令添加到脚本或别名中;这将给我一个命令提交&amp;测试。如果由于某种原因我想在没有测试推送的情况下进行提交(反之亦然),那么我也有这些选项。

答案 4 :(得分:1)

在GitHub上托管并使用他们的post-recieve hooks。这就是像DevverRunCodeRun这样的服务。

答案 5 :(得分:0)

我考虑跳过git并转到共享文件夹/ NFS / rsync解决方案,但这有一个主要问题:它不是由提交触发/限制,所以我最终会得到假阳性的破坏版本我正在打字的时候。