远程跟踪 Git 中的当前分支
-
21-09-2019 - |
题
我正在将连续测试转移到专用服务器(自动测试会使我的本地笔记本电脑速度减慢太多)。我希望我的测试服务器(恰好运行 CruiseControl.rb)能够通过 Git 不断获取我最新的(提交的)更改——理想情况下,我自己的工作流程不需要任何更改。我是唯一从事该项目的开发人员。
在获得测试服务器之前,我有:
- 我的笔记本电脑作为我的主要开发系统
- 我的本地存储库中有多个分支。
- 本地工作副本,指向其中一个分支。我经常在分支之间切换(通常是为了新功能)。
- 一个 GitHub 帐户,我经常将本地分支推送到镜像远程分支。(这主要用于异地备份;我不会分享我当前项目的任何代码)。我尝试至少在每个工作日结束时推送到 GitHub,尽管我偶尔会忘记。
我想保持所有这些完好无损。最重要的是,我现在有:
- 测试服务器
- ...运行 CruiseControl.rb
- 我的测试服务器上的笔记本电脑存储库的克隆。(目前还没有克隆GitHub)
- 测试服务器上的本地工作副本,CC 从中构建/测试。
- 这个工作副本指向一个特定的 Git 分支(当然)
我一直在尝试让我的测试服务器自动获取我在笔记本电脑工作副本上工作的任何分支并从中构建。(这将模仿自动测试的连续测试,而不会消耗系统资源)。
我尝试过但没有成功的事情:
- git checkout 来源/头:这可以使文件正常,但会破坏 CruiseControl,因为它不喜欢“无分支”工作副本。
- git checkout --track -b a_branch origin/a_branch:这对于获取文件来说效果很好,CC 喜欢它,但它将测试服务器固定到特定的分支。当在笔记本电脑上切换分支时,我将有效地停止测试我当前的工作。
- git checkout --track -b my_testing_branch origin/HEAD:这也得到了可构建的文件,但它遇到了与上面的命令相同的问题。从 origin/HEAD 创建分支只会获取“默认”分支的 HEAD,因此它也是粘性的。
有什么方法可以让我获得一个良好的远程连续测试系统(有或没有 git 分支),并且不涉及对我的工作流程进行重大更改?
解决方案
另一种选择是写一个 钩 通知测试服务器要拉取的新代码。特别是,一个 post-commit
hook 可能是更好的路线。然后,每次提交时,您都可以通知测试服务器要提取什么以及从哪个分支提取。
其他提示
您可以有一个专用的测试分支,您可以在其中合并当前分支的工作。
您可以强制用当前工作分支的提交替换该分支的内容(请参阅 git merge -s ours,那“他们的”呢 问题)。
然后在 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
因此,原始存储库当前位于 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
在您的笔记本电脑上,在变基期间,它可能会到达一些无效或不需要的位置。
我认为通过颠倒两个系统之间的关系得到了一个很好的解决方案。我可以让笔记本电脑将更改推送到要测试的服务器,而不是让测试服务器从笔记本电脑的存储库中提取。
首先,我在笔记本电脑的存储库上添加一个遥控器:
git remote add testing <url of testing server>
然后,每当我有要测试的代码时,我都会进行推送:
git push -f testing HEAD:master
这将在我当前所在的任何分支上工作。-f 确保我会吹走该分支中已有的所有内容;我不必担心任何血统。
这实际上不会将最新代码放入工作副本中,但 CruiseControl 的轮询可以解决这个问题。我还可以有一个服务器端钩子来更新工作副本 和 运行测试套件(那时我什至不需要 CC)。
我可能想向脚本或别名添加组合的提交+推送命令;这将为我提供单命令提交和测试。如果出于某种原因我想在没有测试推送的情况下进行提交(反之亦然),那么我也有这些选项。
我考虑过跳过 git 并转到共享文件夹/NFS/rsync 解决方案,但这有一个主要问题:它不是由提交触发/仅限于提交,因此当我正在输入某些内容时,我最终会得到误报损坏的构建。