【问题标题】:Migrating a Gerrit project into a different instance of Gerrit将 Gerrit 项目迁移到另一个 Gerrit 实例
【发布时间】:2013-07-25 06:21:18
【问题描述】:

我有 MainGerritServer 托管许多项目。
另外,我有RogueGerritServer,它也托管了许多项目。

我正在寻找一种方法将 ProjectA 从 RogueGerritServer 移动到 MainGerritServer,同时保留 Git 提交历史和 Gerrit 审查历史。

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

如果是简单的 Git 安装,我只需将 ProjectA 克隆到我的计算机中,然后推送到 MainGerritServer。基于 Gerrit 的项目是否以同样的方式工作?

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

如果你能告诉我我是否误解了如何处理这个问题,我将不胜感激。

谢谢

【问题讨论】:

    标签: git migration gerrit migrate


    【解决方案1】:

    我最近一直在迁移很多 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 个表,并且您的项目历史遍布其中。

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

    你可以找出传入集合的最大change_id,去 手动碰撞目标服务器的 change_id_seq 以保留 足够的 id 空间,然后将所有旧的 change_ids 撞到某个基数 价值,所以他们在目的地的一个独特的空间......最后 将行加载到目的地。

    这样就可以了。后腿疼。

    【讨论】:

    • 感谢您提供的优质信息!我会(尝试)联系 Shawn Pearce,看看迁移是否有任何进展。
    【解决方案2】:

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

    更多文档:

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

    【讨论】:

    • 感谢下载链接! +1
    【解决方案3】:

    answer by David Pursehouse 中引入的导入器插件似乎是要走的路。然而,当我努力获取二进制文件时(它似乎无法下载,必须自己构建有download links,但我在撰写本文时并不知道它们this) 以及使用它,我认为我添加了我的经验。

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

    步骤:

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

    (参考installation instructions)

    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。

    (参考build instructions)

    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_site/bin/gerrit.sh restart重启你的gerrit实例

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

    之后,流程如下:

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

    先进行初始导入,然后再恢复导入 优点是可以将项目团队的停机时间保持在最低限度。 最初的项目导入可能需要一些时间,但简历应该 要快,因为它只需要从初始传输增量 (最后)导入。

    (参考:About.md)

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

    【讨论】:

    • 导入器插件可从(非官方)CI 服务器下载。 - master version - stable-2.12 version - stable-2.11 version
    • @DavidPursehouse 很酷,谢谢。我想这使我的回答变得多余。您是否碰巧有任何关于网络超时问题的 cmets,或者从其他服务器导入通常需要多长时间?
    • 对不起,我不知道。导入器插件的创建者是其他 Gerrit 维护者之一,因此您可能会在 Gerrit 邮件列表(Google Groups 上的 repo-discuss)上获得更好的帮助。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      相关资源
      最近更新 更多