搭建gerrit服务器----上传一份完整的Android源码

由于搭建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
}

发布源码中不包含.git的方法,原本包含.git的话,原理相同,只是省略commit这步。 

function pushLocalToRemote()
{
 
    while read LINE
    do
        cd $LOCAL_PATH
        command_line=`echo $LINE | grep "<project"`
        if [ "$command_line" ]
        then
            #echo $LINE
            reposity_name_sec=${LINE#*name=\"}
            reposity_path_sec=${LINE#*path=\"}
 
            if [ "$reposity_name_sec" ] && [ "$reposity_path_sec" ]
            then
                reposity_name=${reposity_name_sec%%\"*}
                reposity_path=${reposity_path_sec%%\"*}
 
                src_path=$LOCAL_PATH/$reposity_path
 
                if [ -d "$src_path" ]; then
                    cd $src_path
                    echo `pwd`
 
                    rm -rf .git
                    rm -rf .gitignore
					touch readme.txt #there maybe some empty project here. Create an change for push.
                    git init
                    git remote add origin ssh://$USER_NAME@$SERVER_IP:$SERVER_PORT/$PROJECT_NAME_PREFIX/$reposity_name
                   # git pull origin master
                    git add -f -A
                    git commit -am "init commit"
                    git push origin master
                    cd -
                fi
            fi
        fi
 
    done  < $MANIFEST_XML_FILE
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值