将Gerrit项目迁移到Gerrit的其他实例

时间:2013-07-25 06:21:18

标签: git migration gerrit migrate

我有MainGerritServer主持许多项目 此外,我还有RogueGerritServer,它还承载了许多项目。

我正在寻找一种方法将ProjectARogueGerritServer移到MainGerritServer,同时保留Git提交历史记录以及Gerrit审核历史记录。

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

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

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

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

谢谢

3 个答案:

答案 0 :(得分:11)

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

以下是如何移动回购:

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

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

  4. 推送到新遥控器。推送完整的历史记录:

    git push - 所有NewGerrit

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

    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服务器。 注意CAVEAT :change_id值可能会发生冲突。不过他确实建议解决这个问题:

      

    你可以找到传入集的最大change_id,去吧   手动将目标服务器的change_id_seq置于保留状态   足够的id空间,然后通过一些基础碰撞所有旧的change_ids   价值因此他们在目的地的独特空间......最后   将行加载到目标。

    所以可以做到。这是后面的痛苦。

答案 1 :(得分:0)

answer by David Pursehouse中介绍的导入程序插件似乎是要走的路。然而,当我努力获取二进制文件时(它似乎不可下载,必须自己构建它download links,但我当时并不知道它们写这篇文章以及使用它,以为我加入了这方面的经验。

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

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

    (参考installation instructions

    1. 下载并编译导入程序
    2. 步骤:

      $ 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

      3. 重新启动您的gerrit实例
      4. 插件应该在web ui中可见
      5. 之后,流程如下:

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

          首先进行初始导入,然后再继续导入   优点是项目团队的停机时间可以保持最小化。   初始项目导入可能需要一些时间,但简历应该   要快,因为它只需要从初始转移delta   (最后)导入。

        (参考:About.md

        就个人而言,我无法让导入过程发挥作用。在接入阶段,经过几个小时的工作,至少在我们的网络上,我们会遇到java.io.IOException: Unexpected response code for GET on /config/server/version : 504,这意味着网络超时才会进入某个状态。即使是小回购也会发生这种情况。

答案 2 :(得分:0)

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