0

我最近问了一个关于镜像到 gerrit 的机制的问题,但我开始认为这可能不是一件理想的事情(知道有用但可能不适用于这个用例)。这个问题建立在那个问题之上。

我们想在 github 上开展一个项目,我们想看看它的分支。我们会用 gerrit 来解决这个问题。我想查看分支(和标签),但我不想直接在远程分支上签出……我们将拥有自己的本地分支和标签。

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

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

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

我要补充一点,我现在知道一个相关的问题。也许我特别考虑了“远程”的事情,但是镜像或克隆的问题仍然存在——人们将基于标签和本地、唯一命名的分支而不是远程来工作。我想极力避免内部也可能出现的命名冲突,因此知道如何以最佳方式做到这一点不仅仅是学术性的。

4

2 回答 2

0

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

该方案不会使事情变得更清晰,更不容易出错,而是会使它们复杂化并使错误变得很容易。

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

于 2012-09-13T13:16:42.500 回答
0

希望其他人加入进来。

最简单的解决方案似乎不是镜像,而是简单地制作一个新的本地克隆,然后将其推送到 gerrit,在推送命令的末尾添加“refs/*:refs/*”,以确保远程 refs最终出现在 gerrit 的仓库中。

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

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

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

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

如果您从mirror开始执行所有这些操作,则外部 refs 会按原样(而不是远程)引入,并且外部分支会出现在 gerrit Web UI 中,就像您将它们放在那里一样。这有它自己的用途,但对于我正在做的事情,它不会有帮助。

于 2012-09-14T01:20:06.533 回答