由于搭建gerrit服务器的文章已经很多了,我就不重复造轮子了。但是很少有文章介绍怎么去上传源码的文章,这里介绍下我以前的思路。
对于单个git 仓库是很简单的,这里只介绍一整份Android源码。
这里先介绍下Android源码里面manifest XML(载货清单)的大致结构。(下图从网上找的一个)
remote 指定了远程服务器的一些信息,地址,分支、等等。一些大公司的代码是分了好多服务器在存储。
default:是默认的代码下载地址
project:指明了服务器上的project名字,以及下载到本地后存放的路径path。copyfile 用于将某文件拷贝到目标文件。Android源码中包含了成百上千个这种project,每一个包含了.git的就是这样一个工程。
倘若你手上拿到的代码是直接从厂商的服务器下载下来的,含有.repo,那么恭喜你你是非常幸运的,因为你不需要再单独切割划分工程了,此时若想上传到你自己的服务器会简化很多。我最开始想着用repo forall 命令操作所有仓库上传到gerrit服务器,但发现没有指定自己搭建的服务器。于是编写了一个shell脚本。核心思想是根据载货清单遍历每一个仓库,然后在服务器上创建对应的仓库,再将本地代码中的仓库push到服务上就行。
#从.repo/manifest.xml中获取各个仓的名字和路径,这里将获取到的project名字输出到OUTPUT_PROJECT_LIST_FILE_NAME(名字可以随便起)
function getNameAndPath()
{
echo > $OUTPUT_PROJECT_LIST_FILE_NAME
echo > $OUTPUT_PROJECT_LIST_FILE_PATH
while read LINE
do
command_line=`echo $LINE | grep "<project"`
if [ "$command_line" ]
then
#echo $LINE
reposity_name_sec=${LINE#*name=\"}
reposity_path_sec=${LINE#*path=\"}
if [ "$reposity_path_sec" ]
then
reposity_name=${reposity_name_sec%%\"*}
reposity_path=${reposity_path_sec%%\"*}
echo "$reposity_name" >> $OUTPUT_PROJECT_LIST_FILE_NAME
echo "$reposity_path" >> $OUTPUT_PROJECT_LIST_FILE_PATH
elif [ "$reposity_name_sec" ]
then
reposity_name=${reposity_path_sec%%\"*}
echo "$reposity_name" >> $OUTPUT_PROJECT_LIST_FILE_NAME
fi
fi
done < $MANIFEST_XML_FILE
}
在远程服务器上创建对应工程的方法:
#在远程gerrit服务器建立各个仓
function creatEmptyGerritProject()
{
for i in `cat $OUTPUT_PROJECT_LIST_FILE_NAME`;
do
echo $i
echo "ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project -n $PROJECT_NAME_PREFIX/$i"
#在gerrit服务器创建空项目
ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project -n $PROJECT_NAME_PREFIX/$i
done
}