1. 目的
公司本来有一个项目,里面有从客户clone下来的git仓库sdk,我们自己在windows下建立的svn仓库seu_code,现在要做的事情是,把这两个仓库都移植到我们公司内部的git服务器,原来sdk的log可以忽略丢失,但是原来svn的log希望保留,以方便后续跟踪调试。两个仓库移植后,都用git管理,不需要svn管理。
2.移植
2.1 总体布局
这两个仓库其实属于同一个项目,所以,在布局上,希望把这两个仓库归一放置。在服务器上新增仓库,有两种方法,一种是通过在git管理员客户端修改gitolite-admin/conf/gitolite.conf来新增repo,文件Push后会自动创建仓库(查看服务器端的Repository/*.git),另外一种方法,是在gitolite.conf的repo后面用通配符,然后在客户端先生成好git仓库,然后再上传本地的git仓库到服务器。我们采用后面一种方法。
首先修改git管理员客户端 gitolite-admin/conf/gitolite.conf,增加下面几行:
repo seu_ccplayer_all/.+$RW+C = @media
RW+ = i5_admin
C = i5_admin
RW+ = litong
上面的repo使用了通配符,这需要在服务器端Gitolite的安装用户(如git)主目录下,修改配置文件.gitolite.rc,使其包含如下配置:
$GL_WILDREPOS = 1;
上传push gitlotie.conf,这个时候可以查看服务器端的Repository目录,多了一个seu_ccplayer_all的目录,目录下面为空。可知这里repo里seu_ccplayer_all这个目录,指的是服务器端的Repository(存放所有.git目录)的子目录结构。同时可以从文件里看到,用户i5_admin和组media有在这个目录下创建git库的权利,而用户litong只有读写和推送权。
2.2 git到git
下面的操作在i5_admin客户端进行。首先创建目录sdk,进入目录sdk, 并进行本地git初始化。
mkdir sdk;
cd sdk;
git init;
把原来的仓库sdk所有内容拷贝到这个目录下,注意不要拷贝.git。然后在本地add,commit。
git add ./
git commit ./ -m “add sdk from origin”
如果想创建一个空的sdk仓库,git init之后也要在本地先commit一下,用下面参数:
git commit --allow-empty
然后使用git remote指令设置远程版本库。
git remote add origin gitolite:seu_ccplayer_all/sdk.git
使用完这个命令后,在服务器端Repository/seu_ccplayer_all/下面不会看到任何新添的.git,因为这一步只是告诉本地库,我要把本地的仓库匹配添加到远程对应的哪个地方而已,并没有涉及到任何于服务器有关的操作。所以这一步,即使ssh别名(gitolite)有误,也不会在这里报错,因为这一步只是设置本地仓库,根本没有去联网。
如果我们发现这一步目录打错了或者设置错了,在重新git remote add之前,需要先删除掉这个匹配,用如下命令:
git remote rm origin
然后,我们用git push完成在服务器端版本库的创建
git push origin master
这一步才真正地联到服务器创建seu_ccplayer_all/sdk.git。如果上一步设置有错,或者目录或名字写错,会在这一步报错,报没有这个权限或者没有这个仓库路径等等,大家可自行灵活观察调试。这一步完成以后,我们的git仓库就创建好了,这个时候看服务器端的Repository/seu_ccplayer_all/下面,就出现了sdk.git了。
2.3 svn到git
下面的也是在i5_admin的客户端做的事情。
首先,这个要先安装git-svn:
apt-get install git-svn
然后,把windows上的svn仓库seu_ccplayer拷到本地 /home/liaowm/git_i5/seu_ccplayer_all/from_svn/seu_ccplayer, ls可知这个目录里包含了5个目录:conf dav db hooks locks 和2个文件format README.txt。然后进行本地转换:
git svn clone -s file:///home/liaowm/git_i5/seu_ccplayer_all/from_svn/seu_ccplayer seu_code
注意这里file://指的是本地文件协议的意思,而且要留意,这里要写绝对路径,不能写相对路径(我还第一次知道了fiel://这个协议)。如果i5_admin服务器可以通过远程访问到原来windows的svn服务器,那么我猜这里就不用先拷贝到本机这么麻烦了,直接 git svn clone -s http://window-server/seu_ccplayer seu_code就可以了。看打印信息及结果,生成了seu_code文件夹,里面就是对应的svn的内容(是svn本身的内容,不是仓库hooks等文件)以及对应的.git目录。到seu_code里,用git log,可以看到原来svn里的所有提交记录,并且每条记录都有一行git-svn-id作标记,以说明这个记录是原来由svn产生的。想不要这条标记,可以在git svn clone 时添加 --no-metadata参数。
git svn clone, 其实就是做了 git svn init + git svn fetch的工作,因此,想把这个本地库提交到服务器,跟上面做的一样就可以了:
git remote add origin gitolite:seu_ccplayer_all/seu_code.git
git push origin master
大功告成。
3. 其他