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 管理下git库分支导入

把其他git库中的分支导入gerrit管理下的库中的方法 一、取Gerrit 中的库 添加要导入分支库为新的remote,基于要导入的分支建立新分,然后将新分支push的gerrit git库  ...

Gerrit工作流程:

OpenStack开发者为社区贡献代码,需要将自己的代码发布出来,经过社区成员的评审,通过之后才能批准进入Openstack代码仓库。Gerrit作为Openstack项目的代码评审工具,有着一套特殊...
  • Shatty
  • Shatty
  • 2013年08月22日 22:05
  • 28287

Gerrit代码审核服务器搭建全过程

Gerrit代码审核服务器搭建全过程             如果说Linux + git 是Linus对IT界的两大贡献,那么Android + Gerrit便是Google对IT界的两份厚礼。下面...
  • ganshuyu
  • ganshuyu
  • 2013年05月27日 15:55
  • 62648

git提交gerrit 流程笔记

1, 从主分支clone代码到本地(注意版本分支)         git clone  地址  分支 2,   拉下分支版本后,以该版本新增一个开发分支(留一个原始的分支以防不测)      ...

Gerrit 使用规范

代码提交要求 一个Commit对应一个修改点(除非是在项目初始阶段或是升级BSP时)。 不要随便修改文件的属性。Windows 修改过的文件属性会变成755,上传代码时请注意修改成...

Gerrit使用说明手册

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

git push 小结

$ git push ssh://git@dev.lemote.com/rt4ls.git master // 把本地仓库提交到远程仓库的master分支中 $ git remote add ori...

Gerrit 添加一个已经有的git工程到gerrit服务器

The other alternative is if you already have a git project that you want to try out Gerrit on. First...
  • xbl1986
  • xbl1986
  • 2014年01月18日 15:56
  • 7482

Repo全解之自己搭建repo仓库

repo是google基于git使用python编写的一个对android源码进行管理的工具(好长呀,信息量足了)...

[积累] gerrit 不经代码审核直接push进库的方法

需求: gerrit 代码审核将代码入库权限收起,可以有效控制代码质量. 但同时弊端也是明显的: 对于频繁改动的项目(比如新项目),每段代码都审核会明显拖慢工作效率. 这时可以给某个组配置不经审核直接...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:git学习--批量上传本地代码库到gerrit服务器---保留本地代码库所有分支和tag信息
举报原因:
原因补充:

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