远程跟踪Git中的当前分支

3
我将我的持续测试迁移到了专用服务器上(autotest会使我的本地笔记本电脑变慢)。我希望我的测试服务器(恰好运行CruiseControl.rb)能够通过Git不断获取我的最新提交的更改,最好不需要对我的工作流程进行任何更改。我是这个项目中唯一的开发人员。
在获得测试服务器之前,我有:
- 我的笔记本电脑作为我的主要开发系统 - 本地存储库中的多个分支。 - 指向其中一个分支的本地工作副本。我经常在分支之间切换(通常是为了新功能)。 - GitHub账户,我经常将本地分支推送到镜像远程分支。(这主要是用于离线备份;我没有分享任何当前项目的代码)。我尝试在每个工作日结束时至少推送到GitHub,但偶尔会忘记。
我希望保留所有这些内容。除此之外,我现在还有:
- 测试服务器 - ……运行CruiseControl.rb - 在我的测试服务器上克隆了我的笔记本电脑存储库。 (目前它没有克隆GitHub) - 测试服务器上的本地工作副本,从中CC正在构建/测试。 - 这个工作副本指向一个特定的Git分支(当然)
我一直在尝试让我的测试服务器自动获取我笔记本电脑的工作副本上正在工作的任何分支并从中构建。 (这将模拟autotest的持续测试,而不会占用系统资源)。
我尝试过但没有成功的事情:
- 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个回答

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

为了让测试服务器拉取最新的代码进行测试,您必须将其推送到服务器可以获取的位置,而我不认为git中有一个后置推钩子,我也认为该钩子将在执行推送的机器上运行(例如,您的笔记本电脑,而不是具有存储库的服务器)。 - Teflon Ted
最初,我完全没有使用推送,而是让服务器从我的笔记本电脑拉取。帕特的建议使用 post-commit 钩子可能有效,如果它触发了一个消息到服务器(例如:ssh 远程命令),导致服务器开始拉取。然而,目前我又倾向于使用推送路线。 - Craig Walker
实际上,在git-push中,有一个形式为--receive-pack的“post-push”钩子。 - Craig Walker

1

你可以创建一个专门的测试分支,将当前分支的工作合并到该分支上。
你可以强制替换该分支的内容为当前工作分支的提交(参见git merge -s ours, what about “their” 问题)。

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

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

这意味着在笔记本电脑上首先进行一些当前工作的发布以进行测试。


还不错;不过,很遗憾,我需要额外的常规步骤将我的当前工作合并到测试分支中,但目前它是最优秀的。谢谢。 - Craig Walker

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不一定是您想象的那样。例如,在变基期间,HEAD会向前和向后移动。如果您的测试服务器在变基期间检查您笔记本电脑上的HEAD,它可能会得到一些无效或不希望的位置。


我碰巧在这个周末做了很多变基操作,所以这是一个问题。:-\ - Craig Walker

1

我认为通过颠倒两个系统之间的关系,我已经想出了一个相当不错的解决方案。与其让测试服务器从笔记本电脑的代码库中拉取代码,不如让笔记本电脑将更改推送到服务器进行测试。

首先,在笔记本电脑的代码库上添加一个远程地址:

git remote add testing <url of testing server>

然后,每当我有需要测试的代码时,我就进行推送:

git push -f testing HEAD:master

这将在我当前所在的任何分支上工作。 -f 确保我会清除该分支中已有的任何内容;我不必担心任何祖先。

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

我可能想要将组合提交+推送命令添加到脚本或别名中;这将为我提供一个一键式提交和测试。如果出于某种原因我想进行提交而没有测试推送(或反之亦然),那么我也有这些选项。


1
иҝҷжҳҜдҪ еҸҜд»ҘеңЁpost-commitй’©еӯҗдёӯе®ҢжҲҗзҡ„е·ҘдҪңгҖӮеҸӘйңҖиҰҒжіЁж„ҸдёҚиҰҒиҰҶзӣ–жӯЈеңЁиҝӣиЎҢжһ„е»әжҲ–жөӢиҜ•зҡ„д»Јз ҒеҚіеҸҜгҖӮ - Pat Notz

1

0

我考虑跳过 Git 直接使用共享文件夹/NFS/rsync 方案,但这有一个主要问题:它不是由提交触发/限制的,所以当我正在输入时,最终会出现误报的构建错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接