我有MainGerritServer
主持许多项目
此外,我还有RogueGerritServer
,它还承载了许多项目。
我正在寻找一种方法将ProjectA
从RogueGerritServer
移到MainGerritServer
,同时保留Git提交历史记录以及Gerrit审核历史记录。
例如,我想将Android项目的Gerrit历史记录导入到我自己的Gerrit服务器上,这样当我处理Android的分叉版本时,我可以在本地服务器上查找Gerrit历史记录。最好的方法是什么?
如果是简单的Git安装,我只需将ProjectA
克隆到我的计算机中,然后推送到MainGerritServer
。基于Gerrit的项目是否以相同的方式工作?
我担心因为Gerrit安装在后台使用数据库,我不确定是否还需要迁移数据库中的信息。我看到很多关于采用数据库转储并将其移动到全新服务器的线程。但是,我试图只移动一个项目,因此采用数据库转储似乎不合适。我看到的最接近的答案是this,这仍然不是我正在寻找的。 p>
我很感激任何帮助,特别是如果你能告诉我我是否误解了如何解决这个问题。
谢谢
答案 0 :(得分:11)
我最近一直在调动很多git项目,虽然我大部分时间都是从Gerrit搬家(由于部门法令,Gerrit是一个很好的选择IMO),但这应该是相同的,并且相对容易。然而,移动Gerrit历史会更加困难。
以下是如何移动回购:
在要移动的项目的本地克隆中,将新项目位置添加为新远程:
git remote add NewGerrit ssh:// NewGerritServer:29418 / NewProject
推送到新遥控器。推送完整的历史记录:
git push - 所有NewGerrit
您还可以通过添加-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,但我当时并不知道它们写这篇文章以及使用它,以为我加入了这方面的经验。
步骤:
$ sudo apt-get ant -y
$ git clone https://github.com/facebook/buck.git
$ cd buck
$ ant
步骤:
$ 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
。
将生成的.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
。
使用$gerrit_site/bin/gerrit.sh restart
之后,流程如下:
- 执行项目的初始导入
- 测试目标Gerrit,一切正常
- 通知项目团队项目移动,并禁止在源Gerrit服务器中对项目进行进一步修改(例如,通过 权限或将项目状态设置为只读)
- 恢复项目导入以获取在初始导入后完成的所有修改
- 完成导入,如果需要,可以在目标Gerrit服务器中创建可写项目
- 通知项目团队他们现在可以在目标Gerrit服务器上处理项目
- 重新配置任何第三方工具(例如Jenkins)以对抗目标Gerrit服务器中的项目
- [可选]使用delete-project插件
删除源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分支,所以我只是重试并重新尝试导入,直到它最终成功。