如何将repo projects推到自己的Gerrit Server
特别说明
如果repo projects是可以下载的,建议下载时,repo init之后,到.repo中找到对应manifest,将所有的clone-depth删除,避免后面在git push的时候出现难以解决的错误:
remote unpack failed:error Missing commit
开始操作
1. 遍历所有project
在repo projects根目录执行:
repo forall -c 'echo $REPO_PROJECT' | tee projects.txt
如果所有的proejcet放到同一目录下,而不是Gerrit根目录,则可以:
repo forall -c 'echo xxx/$REPO_PROJECT' | tee projects.txt
2. 生成批量创建project的脚本
修改{user}和{GerritServer}
注意要确保user是有创建Project的权限:
sed 's/^/ssh -p 29418 {user}@{GerritServer} gerrit create-project /' projects.txt> createProjects.sh
3. 执行脚本创建空projects
chmod 777 createProjects.sh
./createProjects.sh
执行过程可能会报project already exist,这说明存在多个Repo Path指向了同个Repo Project,通常是branch或revision(commit id)不同。 这时候可以将前面的projects.txt内容贴到excel表,利用excel表的查重功能找出这些project。
再到manifest文件中搜索这些project,确认是branch不同还是revision不同,在Push完所有代码后再补操作。
4. 确认Gerrit All-Projects的权限
5. Push所有代码
修改{user}、{GerritServer}、{xxx}和{BranchName}
(repo forall -c 'pwd && git push --tags -f -o skip-validation ssh://{user}@{GerritServer}:29418/{xxx}/$REPO_PROJECT HEAD:refs/heads/{BranchName}')2>&1 | tee push.log
6. 单project推送
如果出现个别project推送失败需要重新推送,可以到相应路径下执行如下命令:(修改{user}、{GerritServer}和{ProjectName})
git push --tags -f -o skip-validation ssh://{user}@{GerritServer}:29418/{ProjectName} HEAD:refs/heads/{BranchName}
7. project already exist处理
核对完manifest后:
- 若是branch不同,则查看Gerrit上现在的codebase是哪个Branch,然后到还没被Push上去的Project Path,用同样的push命令,更换BranchName后执行
- 若是revision不同,则查看Gerrit上的Branch log中有没有包含到所有revision,若没有,则到revision最新的Project Path下再执行一次push
8. 建立自己的repo manifest
- 将原来的.repo/manifest/xxx.xml拷贝一份到自己Gerrit manifest仓库下,然后将里面的dest-branch和upstream都改成自己新建的BranchName。
- 删除所有project revision,可以用Nodepad++的正则表达式,将所有revision=“xxx”替换为空,但要保留内的revision
- 针对多Path指向同一个Project不同Branch,则要特别保留它的dest-branch和revision,revision没有保留的话,会被上的revision覆盖
- 针对多Path指向同一个Project不同revision,则要特别保留它的revision
revision=\"([^\"]*)\"
注意如果想避免多出一个空格,想在查找目标中多加一个空格一起替换掉,则要加在前面,因为有的project把revision放在最后,后面没有空格。