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

原创 2015年11月18日 18:14:00

本篇学习点:

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


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


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

相关文章推荐

Gerrit使用说明手册

Gerrit使用说明手册1. 用户组新用户由系统组配置帐号后,登录192.168.0.80输入管理员给你创建的帐号,然后注册,注册相关信息,包括邮箱,全名,ssh-key 配置界面如下: 1.1 ...

【转】Gerrit使用介绍

Gerrit使用介绍 软件测试技术交流群 : 429183023  在code Review的过程中,最好的方式就是别人帮你review代码,因为自己总是觉得“我的代码绝对没有问题”,gerri...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

gerrit使用说明

转载:http://www.scmeye.com/thread-1665-1-1.html 入门 Gerrit简介 Gerrit是一个建立在Git版本控制系统之上,基于Web的代码审查工...

Android设计模式学习之观察者模式

观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI...

关注CSDN程序人生公众号,轻松获得下载积分

关注公众号 在公众号里回复“”秘密“”两个字 返回 http://task.csdn.net/m/task/home?task_id=398 领取奖励 提示:根据公众号里的自动回复,完成...

阿里云服务器Linux下配置web服务环境

下载XShell工具,链接到阿里云Linux服务器上。关于XShell使用,这里有一个入门教程:http://www.cnblogs.com/perseverancevictory/p/4910145...

属性动画----把图片渐渐变小不见(主函数MainActivity 页面)(XML布局)(本布局和渐变布局一样)

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schema...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)