git学习--批量上传本地代码库到gerrit服务器---保留本地代码库所有分支和tag信息

来源:互联网 发布:unity3d 材质 编辑:程序博客网 时间:2024/06/10 22:53

本篇学习点:

1.gerrit服务器代码库建立

2.git命令使用

说明:此篇文章和repo批量创建远端仓库----建立自己的android代码仓库 的不同点在于,用本章方法可以将本地仓库的所有本地分支信息和tag信息完整的上传到gerrit代码库,而用repo批量创建远端仓库----建立自己的android代码仓库   这篇文章描述的方式则只是将本地代码当前HEAD位置上传为gerrit服务器的master分支,本地所有其他分支和tag信息都没有上传,无法切换到先前本地已有的分支和tag点。


使用背景:

    1. 公司使用的gerrit服务器硬盘坏了,因此无法链接gerrit服务器,无法使用克隆裸仓库到本地然后重新在新服务器上提交的方法进行gerrit服务器迁移。那么问题来了,怎样将本地已经保存的一份代码原本的还原到新搭建的gerrit库上了。经过实践摸索,可以通过一个脚本实现,把所有本地仓库的代码(包括每一个仓库的所有本地分支信息和tag标签信息)全部上传到gerrit服务器。

    2.这也是搭建新gerrit服务器后,然后上传新代码库的方法,完全保留了代码库的所有分支和标签信息。


实现方式:

通过一个脚本GitPushAllLocalReposityToGerrit.sh实现,此脚本放到android源码根目录下使用。脚本内容如下:

#BEGIN:

#####################################################################################
##将本地代码全部上传到gerrit服务器进行管理,包括每一个仓库的本地所有分支和tag
#####################################################################################
LOCAL_PATH=`pwd`
MANIFEST_XML_FILE=$LOCAL_PATH/.repo/manifest.xml

#项目各个仓库的前缀,用于区分多个项目仓
PROJECT_NAME_PREFIX="android-4.3_mirror"
#git用户名字,gerrit服务器ip,gerrit服务器端口
USER_NAME="yanxiangyfg"
SERVER_IP="172.26.13.71"
SERVER_PORT="29418"

#用repo命令时表示各个仓库的变量
REPO_PROJECT_STRING="\$REPO_PROJECT"


OUTPUT_PROJECT_LIST_FILE_NAME=$LOCAL_PATH/project_list_name
OUTPUT_PROJECT_LIST_FILE_PATH=$LOCAL_PATH/project_list_path

#从.repo/manifest.xml中获取各个仓的名字和路径
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_name_sec" ] && [ "$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
            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
}



#推送本地仓库到服务器,包括本地仓库的所有branch分支信息和tag标签信息
function pushLocalReposityToRemote()
{

    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%%\"*}

                cd $LOCAL_PATH/$reposity_path
                echo `pwd`

                REMOTE_REPOSITY_NAME=`git remote`
                ALL_LOCAL_BRANCHS=`git branch -a | grep "remotes/$REMOTE_REPOSITY_NAME"`
                for branchLoop in `echo $ALL_LOCAL_BRANCHS`
                do
                    BRANCH_NAME=${branchLoop#*$REMOTE_REPOSITY_NAME\/}
                    echo "------------local branch name is------------:$BRANCH_NAME"
                
                    #提交本地所以分支信息到远程分支
                    git push  ssh://$USER_NAME@$SERVER_IP:$SERVER_PORT/$PROJECT_NAME_PREFIX/$reposity_name $branchLoop:refs/heads/$BRANCH_NAME
                    #提交本地所以tag信息到远程分支
                    git push --tag ssh://$USER_NAME@$SERVER_IP:$SERVER_PORT/$PROJECT_NAME_PREFIX/$reposity_name
                done


            fi
        fi

    done  < $MANIFEST_XML_FILE

}

#调用函数执行建仓传代码的整个过程
getNameAndPath
creatEmptyGerritProject
pushLocalReposityToRemote

#END


版权声明:本文为博主原创文章,未经博主允许不得转载。


0 0