10

我有MainGerritServer很多项目。
此外,我RogueGerritServer还拥有许多项目。

我正在寻找一种方法来移动ProjectAfrom RogueGerritServerMainGerritServer同时保留 Git 提交历史和 Gerrit 审查历史。

例如,我想将 Android 项目的 Gerrit 历史记录导入到我自己的 Gerrit 服务器上,这样当我在 Android 的 fork 版本上工作时,我可以在本地服务器上查找 Gerrit 历史记录。最好的方法是什么?

如果它是一个简单的 Git 安装,我会简单地克隆ProjectA到我的计算机中,然后推送到MainGerritServer. 基于 Gerrit 的项目是否以同样的方式工作?

我很担心,因为 Gerrit 安装在后台使用数据库,我不确定是否还需要迁移数据库中的信息。我看到很多关于进行数据库转储并将其移动到全新服务器的线程。但是,我试图只移动一个项目,因此进行数据库转储似乎不合适。我看到的最接近的答案是仍然不是我想要的。

我会很感激任何帮助,特别是如果你能告诉我我是否误解了如何处理这个问题。

谢谢

4

4 回答 4

13

我最近一直在转移很多 git 项目,虽然我大部分时间都是从 Gerrit 搬来的(由于部门法令,Gerrit 是 IMO 的一个不错的选择),这应该是一样的,并且相对容易。然而,移动 Gerrit 的历史将更加困难。

以下是如何移动回购:

  1. 从当前源克隆项目。
  2. 创建新的 gerrit 项目。
  3. 在您要移动的项目的本地克隆中,将新项目位置添加为新远程:

    git remote add NewGerrit ssh://NewGerritServer:29418/NewProject

  4. 推送到新的遥控器。要推送完整的历史记录,请执行以下操作:

    git push --all NewGerrit

您还可以通过添加 -u 标志将其设置为自动跟踪新的 repo:

git push --all -u NewGerrit

迁移 Gerrit 数据库是一项更大的工作,老实说,除非绝对必要,否则我建议您干脆放弃它。您可以通过 Gerrit 自己的(糟糕的)查询语言 GSQL 直接访问数据库来了解所涉及的内容。它与 mysql 很像,只是更喜怒无常并且缺少很多功能。

ssh -p 24981 HOSTNAME gerrit gsql

这会给你一个 gsql 提示。试试这个:

gerrit> SHOW TABLES;

至少在我可以访问的 Gerrit 版本中,这些上限很重要。(无可否认,我的已经过时了。)这将向您显示大约 29 个表,并且您的项目历史遍布它们。

根据Shawn Pearce(Gerrit 项目负责人)的这篇文章,您需要将数据库复制到新的数据库服务器,然后使用 SQL 手动删除所有其他项目。然后,您可以转储剩余数据并将其导入其他 Gerrit 服务器。注意警告:可能存在 change_id 值的冲突。但是,他确实建议解决此问题:

您可以找出传入集的最大 change_id,手动调整目标服务器的 change_id_seq 以保留足够的 id 空间,然后将所有旧的 change_id 调整为某个基值,以便它们位于目标中的唯一空间中......和最后将行加载到目的地。

所以可以做到。这是后肢疼痛。

于 2013-07-25T06:53:51.723 回答
7

现在还有一个导入器插件,可用于将 git 存储库和所有评论从一台服务器迁移到另一台服务器。它适用于 Gerrit 2.11 及更高版本。

更多文档:

导入器插件可从(非官方)CI 服务器下载:master 版本stable-2.12 版本stable-2.11版本。

于 2015-08-26T07:53:18.373 回答
0

David Pursehouse在回答中介绍的导入器插件似乎是要走的路。然而,当我努力获取二进制文件时(它似乎无法下载,必须自己构建它,有下载链接,但我在写这篇文章时并不知道它们)以及使用它,以为我添加了我的经验。

  1. 下载、编译和安装Buck。Buck 是由 facebook 创建的构建系统。它需要 linux/unix 系统,不能在 Windows 上运行。

脚步:

$ sudo apt-get ant -y
$ git clone https://github.com/facebook/buck.git
$ cd buck
$ ant

(参考安装说明

  1. 下载并编译导入器

脚步:

$ git clone https://gerrit.googlesource.com/plugins/importer
$ git clone https://gerrit.googlesource.com/bucklets
$ cd importer
$ ln -s ../bucklets . && ln -s bucklets/buckversion .buckversion && ln -s bucklets/watchmanconfig .watchmanconfig

# check latest stable version
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/stable-2.11

# and use that
# why? well, snapshot version depends on snapshot apis, and you get into dependency hell with those...
$ git checkout stable-2.11

$ ../buck/bin/buck build plugin

二进制文件将是buck-out/gen/importer.jar.

(参考构建说明

  1. 将生成的 .jar 复制到您的 $gerrit_site/plugins (如果目录不存在,则创建该目录),或者,如果您需要远程执行,请执行 ssh -i /path/to/your/ssh/key -p 29418 youraccont@localhost gerrit plugin install -n importer.jar /path/to/importer.jar. 后者需要plugins.allowRemoteAdmin启用。

  2. 重启你的gerrit实例$gerrit_site/bin/gerrit.sh restart

  3. 插件应该在 web ui 中可见

之后,流程如下:

  1. 进行项目的初始导入
  2. 在目标 Gerrit 上测试一切正常
  3. 通知项目团队项目移动并禁止在源 Gerrit 服务器中进一步修改项目(例如通过权限或将项目状态设置为只读)
  4. 恢复项目导入以获取在初始导入后完成的所有修改
  5. 完成导入,如果需要,使目标 Gerrit 服务器中的项目可写
  6. 通知项目团队他们现在可以在目标 Gerrit 服务器上处理项目
  7. 重新配置任何第三方工具(例如 Jenkins)以针对目标 Gerrit 服务器中的项目工作
  8. [可选] 使用 delete-project 插件删除源 Gerrit 服务器中的项目

首先进行初始导入并稍后恢复导入的优点是可以将项目团队的停机时间保持在最短。初始项目导入可能需要一些时间,但恢复应该很快,因为它只需要传输自初始(最后)导入以来的增量。

(参考:关于.md

就个人而言,我无法让导入过程正常工作。似乎在导入阶段,经过数小时的工作后,至少在我们的网络上,我们会java.io.IOException: Unexpected response code for GET on /config/server/version : 504在到达某种状态之前收到有意义的网络超时。即使是小型回购也会发生这种情况。

于 2015-11-20T08:49:44.573 回答
0

我能够让导入器插件工作,但也连续出现 504 错误。该插件一次要求 500 次更改(从 GlobalCapability.DEFAULT_MAX_QUERY_LIMIT 读取,硬编码为 500)。我无法成功构建插件的 stable-2.13 分支,所以我只是反复尝试导入,直到它最终成功。

于 2017-08-28T17:03:02.197 回答