有一个项目一直是用Gerrit进行源码管理,最近有个需求要将代码移到GitLab上去,但是又不想放弃Gerrit的代码review功能,这就需要将本地的git仓库与Gerrit和GitLab的远程仓库同时关联。
通常的做法有
1. 使用git remote set-url
命令
使用git remote -v
查看本地库已经关联的Gerrit远程仓库
$ git remote -v
origin ssh://yechy@192.168.1.xxx:xxxx/OTT (fetch)
origin ssh://yechy@192.168.1.xxx:xxxx/OTT (push)
添加GitLab远程仓库,其中origin是已经关联的远程仓库别名,git@gitlab:OTT/GxLive_APK.git
是新的远程仓库地址
$ git remote set-url --add origin git@gitlab:OTT/GxLive_APK.git
再次查看
$ git remote -v
origin ssh://yechy@192.168.1.xxx:xxxx/OTT (fetch)
origin ssh://yechy@192.168.1.xxx:xxxx/OTT (push)
origin git@gitlab:OTT/GxLive_APK.git (push)
可以看到origin这个远程仓库有两个push地址,后面调用git push origin master
就会同时往这两个地址push。需要注意的是这个方法用在不需要review的远程仓库是没问题的,一次push操作就能完成两个仓库的代码上传。但是我们的项目中一个远程仓库是Gerrit,它上传代码的操作是git push origin HEAD:refs/for/dev
,与GitLab仓库push操作不一样,此配置方法实现不了。
2. 使用git remote add
命令
添加远程仓库,使用gitlab作为新的仓库别名,与之前的origin区别开来。
git remote add gitlab git@gitlab:OTT/GxLive_APK.git
查看配置的远程仓库
$ git remote -v
gitlab git@gitlab:OTT/GxLive_APK.git (fetch)
gitlab git@gitlab:OTT/GxLive_APK.git (push)
origin ssh://yechy@192.168.1.xxx:xxxx/OTT (fetch)
origin ssh://yechy@192.168.1.xxx:xxxx/OTT (push)
后面需要push代码的时候两个仓库分别push就可以,对于新加的GitLab,调用git push gitlab master
,Gerrit还是git push origin HEAD:refs/for/dev
。
关于git pull
如果当前分支有关联的远程分支,可用git branch -vv
查看追踪关系
$ git branch -vv
* dev 27437bf [origin/dev] <Apk> Release v1.3.20.
显示本地的dev分支追踪的是origin仓库的dev分支,直接调用git pull
会拉origin仓库dev分支的代码。
执行下面命令可以修改本地dev分支追踪的远程分支,如下
git branch --set-upstream dev gitlab/dev
现在就将追踪的远程分支改为gitlab仓库的dev分支
$ git branch -vv
* dev 27437bf [gitlab/dev] <Apk> Release v1.3.20.
此时在dev分支上git pull
拉的就是gitlab仓库的代码。
网友评论