初始化本地git / gerrit存储库 - 这样做的最佳方法是什么?

时间:2012-09-13 02:38:47

标签: git github gerrit

I asked a question recently关于镜像到gerrit的机制,但我开始认为这可能不是一个理想的事情(知道但可能不适用于这个用例)。这个问题建立在那个问题的基础上。

我们想在github上开展一个项目,我们希望看到分支机构。我们用gerrit来管理这个。我想看到分支(和标签),但我不想直接在远程分支上查看...我们将拥有自己的本地分支和标签。

目前我可以将这样的repo镜像到gerrit,这样它看起来就像是存储库的克隆,有分支和标签就位(例如,分支foobar在本地保持foobar,而不是 origin / foobar 遥控器/起源/ foobar )。但是,似乎让远程refs保持 origin / foobar 等可能更合适(并且更符合通常如何进行)。

那么,是否正在以一种允许其远程分支保持“远程”的方式将外部项目镜像到本地gerrit(例如上面)中,而不是以某种方式克隆它?如果我们永远不想直接在那些远程分支上签出,那么让远程引用指向 origin / foobar 而不是 foobar 是否重要?最后,我希望在非镜像克隆上看到 origin / foobar 我看到 remotes / origin / foobar ...我可能做错了什么那里? (我也失去了使用克隆进行裸镜像的好处,所以无论如何这都是一个糟糕的选择。)

注意:使用fetch的建议有助于填充裸本地仓库(我在原始问题中充实了详细流程,作为使用--mirror的替代方法)。

我要补充一点,我现在知道a related question。也许我特别推翻了“遥控器”的事情,但镜像或克隆的问题仍然存在 - 人们将基于标签和本地的,唯一命名的分支,而不是遥控器。我想尽量避免命名内部可能出现的冲突,因此知道如何以最佳方式做到这一点并不仅仅是学术上的。

2 个答案:

答案 0 :(得分:0)

我不使用gerrit,但我建议保留远程分支名称。分支是指针,它们的命名空间没有什么特别之处。如果您将远程分支重命名为origin/foo而不是foo,则当您在本地跟踪它时,您最终会跟踪origin/origin/foo。本地规范是<remote>/<remote_branch>。这很麻烦,并且在创建本地跟踪分支时不会阻止git checkout在本地默认为origin/foo等操作。

该方案不会使事情变得更清晰,更不容易出错,而是会使问题复杂化并使错误变得非常容易。

根据我的经验,命名冲突是一个工作流问题,而不是一个git问题。例如,我们通常鼓励我们的开发人员使用基于案例ID的名称,并且无论是否为案例ID,所有分支都以作者的首字母(mm/3245mm/gerrit-mirroring-code)开头。我们从git项目本身偷走了这个约定。经过一年的使用(以及近1000个功能分支),我们没有遇到过碰撞。在极少数情况下,两个同名但完全不同的分支被推送到同一个遥控器,git会拒绝推送,因为更新不会快进。

答案 1 :(得分:0)

希望其他人也能加入进来。

对此最简单的解决方案似乎不是镜像,而是简单地创建一个新的本地克隆,然后将其推送到gerrit,在push命令的末尾添加“refs / *:refs / *”,以确保远程裁判最终进入了格里特的回购。

此时你可以看到远程引用,如果你看一下gerrit git repo本身(但不是在web UI中,这很好......我们不想在这项工作中直接合并它们)。

然后,开发人员可以克隆来自gerrit(或其克隆)的repo来完成工作。要查看远程分支引用,它们需要采取额外的步骤来获取引用,因此:

git fetch origin refs/remotes/*:refs/remotes/*

然后他们可以看到遥控器以及其他所有东西。

如果你通过以镜像开始这一切,外部引用按原样引入(而不是作为遥控器),外部分支出现在gerrit Web UI中,就好像你放了他们在那里。它有自己的用途,但对于我正在做的事情,它没有用处。