需求

现在工作中遇到这样的情况,有svn某个目录下有两个项目test1、test2路径下各有三个文件夹,需要将项目转为git项目,并将a文件夹的内容作为master分支,将b文件夹作为b分支,c文件夹作为c分支,写一个自动转化脚本来实现,自动创建git仓库,自动svn迁移到git,自动合并成需要的分支。

或者是a,b,c三个文件夹对应三个分支,不需要master分支也可以使用下面的脚本。

svn结构如下所示

1、需要准备的东西

(1)两个仓库名字,存在一个gitname.txt文件中
需要注意的是,我们写的脚本是shell脚本,是用linux来读的,文件里面的内容格式应该符合linux格式,而不是window格式,例如这里的换行符(黑色的)应该是LF,而不是window的CR LF,一般软件都可以转的,例如notepad++里面为:编辑->文档格式转换->转为unix格式,或者直接有touch命令行创建,然后vi编辑保存的文件是自动带unix格式的,格式不对,读取的信息会重叠错乱

(2)a,b,c,aa,bb,cc六个svn的地址存在test1.txt,test2.txt两个文件中(注意换行格式是LF

(3)再创建一个文件auto.sh里面放置要写的脚本,目前所有文件就准备好了

(4)再准备好git账号的token(下面代码用xxx代替),以及群组名称namespace(下面代码用abc代替),群组namespace_id(下面代码用123代替),群组就是你要将git仓库分配的对象
获取方法这里面有:gitlab api操作实现批量删除、创建

2、脚本解释(后面会贴完整的脚本)
(1)自动创建仓库(点击链接可以参考其他博客了解详情,我在其他地方写过)

token="xxx"
namespace_id="123"
#pro是仓库名称,具体代码是通过遍历读取文件来获取的,这里直接写死
pro="test1"
info="name=$pro&path=$pro&wiki_enabled=no&public_jobs=true&public=true&namespace_id=$namespace_id&default_branch=master&private_token=$token"
curl -d $info "http://10.10.10.10:8080/api/v4/projects"

(2)删除多余仓库(点击链接可以参考其他博客了解详情,我在其他地方写过)

curl -X DELETE "http://10.10.10.10:8080/api/v4/projects/${namespace}%2F${pro}${count}?private_token=$token"

(3)字符串截取
若bran="master:https://10.10.10.10/svn/project/test1/a"
则${bran#*:}为:"https://10.10.10.10/svn/project/test1/a"
则${bran%%:*}为:"master"

(4)说明下面脚本使用
下面的脚本,会遍历读取对应仓库文件,如果有master分支则必须写在文件的第一行,在命令行使用 ./auto.sh 运行即可

3、完整脚本

gitpath="git@10.10.10.10:abc/"
count=1
namespace="abc"
namespace_id=123
token="xxx"
for pro in `cat gitname.txt`
do
    count=1
    for bran in `cat ${pro}.txt`
    do
        if [ $count == 1 ]
        then
        
            if [ ${bran%%:*} == "master" ]
            then 
                #the first repo and its master
                info="name=$pro&path=$pro&wiki_enabled=no&public_jobs=true&public=true&namespace_id=$namespace_id&default_branch=master&private_token=5XQgZ7mdMtUP--2Zz1G9"
                curl -d $info "http://10.10.10.10:8080/api/v4/projects"
                mkdir $pro
                git svn clone ${bran#*:} ${pro} --no-metadata --authors-file=userinfo.txt
                cd $pro
                git remote add origin ${gitpath}${pro}.git
                find . -type d -empty -exec touch {}/.gitkeep \;
                git add .
                git commit -m "1.svn2git"
                git push origin master
                cd ..
        
            else
                #the first repo and its not master
                info="name=$pro&path=$pro&wiki_enabled=no&public_jobs=true&public=true&namespace_id=$namespace_id&default_branch=master&private_token=$token"
                curl -d $info "http://10.10.10.10:8080/api/v4/projects"
                git clone ${gitpath}${pro}.git
                
                info="name=${pro}${count}&path=${pro}${count}&wiki_enabled=no&public_jobs=true&public=true&namespace_id=$namespace_id&default_branch=master&private_token=$token"
                curl -d $info "http://10.10.10.10:8080/api/v4/projects"
                mkdir ${pro}${count}
                git svn clone ${bran#*:} ${pro}${count} --no-metadata --authors-file=userinfo.txt
                cd ${pro}${count}
                git remote add origin ${gitpath}${pro}${count}.git
                find . -type d -empty -exec touch {}/.gitkeep \;
                git add .
                git commit -m "1.svn2git"
                git push origin master
                cd ..
                
                mv ${pro}${count} ${pro}/${pro}${count}
                cd ${pro}
                git remote add ${bran%%:*} ./${pro}${count}
                git fetch ${bran%%:*}
                git checkout -b ${bran%%:*} ${bran%%:*}/master
                mv ${pro}${count} ../${pro}${count}
                git add .
                git commit -m "1.create ${bran##*/} branch"
                git push origin ${bran%%:*}
                cd ..  

                #del repo
                curl -X DELETE "http://10.10.10.10:8080/api/v4/projects/${namespace}%2F${pro}${count}?private_token=$token"
            fi
            
        else
            info="name=${pro}${count}&path=${pro}${count}&wiki_enabled=no&public_jobs=true&public=true&namespace_id=$namespace_id&default_branch=master&private_token=$token"
            curl -d $info "http://10.10.10.10:8080/api/v4/projects"
            mkdir ${pro}${count}
            git svn clone ${bran#*:} ${pro}${count} --no-metadata --authors-file=userinfo.txt
            cd ${pro}${count}
            git remote add origin ${gitpath}${pro}${count}.git
            find . -type d -empty -exec touch {}/.gitkeep \;
            git add .
            git commit -m "1.svn2git"
            git push origin master
            cd ..
            
            mv ${pro}${count} ${pro}/${pro}${count}
            cd ${pro}
            git remote add ${bran%%:*} ./${pro}${count}
            git fetch ${bran%%:*}
            git checkout -b ${bran%%:*} ${bran%%:*}/master
            mv ${pro}${count} ../${pro}${count}
            git add .
            git commit -m "1.create ${bran##*/} branch"
            git push origin ${bran%%:*}
            cd ..      
       
            #del repo
            curl -X DELETE "http://10.10.10.10:8080/api/v4/projects/${namespace}%2F${pro}${count}?private_token=$token"
        fi
        
        let "count++"
    done

done

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐