远程跟踪Git中的当前分支

远程跟踪Git中的当前分支,git,tdd,continuous-integration,cruisecontrol.rb,Git,Tdd,Continuous Integration,Cruisecontrol.rb,我正在将我的连续测试转移到一个专用服务器上(自动测试会使我的本地笔记本电脑速度过慢)。我希望我的测试服务器(正好运行CruiseControl.rb)能够通过Git不断地获取我的最新(提交的)更改——理想情况下,不需要对我自己的工作流程进行任何更改。我是唯一在这个项目上工作的开发人员 在获得测试服务器之前,我有: 我的笔记本电脑是我的主要开发系统 我的本地存储库中有多个分支 指向其中一个分支的本地工作副本。我经常在分支之间切换(通常用于新功能) GitHub帐户,我经常将本地分支推送到镜像的远

我正在将我的连续测试转移到一个专用服务器上(自动测试会使我的本地笔记本电脑速度过慢)。我希望我的测试服务器(正好运行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创建一个分支只会得到“default”分支的头,所以它也是粘性的

我有没有办法得到一个好的远程连续测试系统(有或没有git分支),它不会对我的工作流程进行重大更改?

我考虑过跳过git,转到共享文件夹/NFS/rsync解决方案,但有一个主要问题:它不是由提交触发的,也不限于提交,所以当我正在打字的时候,我最终会得到假阳性断片。 您可以有一个专用的测试分支,在该分支上合并您当前的分支工作。
您可以强制将该分支的内容替换为当前工作分支的提交(请参见问题)

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

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

这意味着在笔记本电脑方面迈出了第一步,发布一些当前的工作以进行测试。

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

测试服务器可以运行
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 现在,由于
origin/foo
的作用类似于
origin/HEAD
(无本地分支),并且您的CruiseControl不喜欢这样,您可能只需要在测试机上创建一个本地分支,然后简单地将其硬重设到最新位置:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}') $ git reset --hard origin/$b $b=$(git远程显示源代码| grep“HEAD branch”| awk-F:“{print$2}”) $git重置--硬原点/$b
注意,这是有点脆弱的,因为
HEAD
me并不总是你想象的那样。例如,在重基
期间,头部将前后移动。如果您的测试服务器在重新设置基址期间检查笔记本电脑上的
,它可能会得到一些无效或不需要的位置。

另一个选项是编写一个通知测试服务器要提取新代码的命令。特别是,
post-commit
hook可能是更好的方法。然后,每次提交时,您都可以通知测试服务器要从哪个分支提取什么。

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

首先,我在笔记本电脑的repo上添加了一个遥控器:

git remote add testing <url of testing server>
这将从我目前所在的任何分支机构起作用。f确保我将吹走该分支中已经存在的任何东西;我不必担心任何祖先

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


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

在GitHub上托管并使用它们的。这就是服务的喜好和做法。

不错;不幸的是,将我当前的工作合并到测试分支需要额外的常规步骤,但到目前为止,它是领先者。ThanksI这个周末碰巧做了很多重定基期的工作,所以这是一个问题-\为了让测试服务器提取最新的代码进行测试,您必须将其推送到服务器可以从中获取的地方,我不相信git中有post push钩子,我还认为该钩子会在执行推送的机器上运行(例如,您的笔记本电脑,而不是带有存储库的服务器),我要完全无需推送,让服务器从我的笔记本电脑上拉出来。Pat建议使用post-commit钩子,如果它向服务器发送一条消息(例如:一条ssh远程命令),那么它就可以工作
git remote add testing <url of testing server>
git push -f testing HEAD:master