svn转git,且自动、批量生成各种分支
需求现在工作中遇到这样的情况,有svn某个目录下有两个项目test1、test2路径下各有三个文件夹,需要将项目转为git项目,并将a文件夹的内容作为master分支,将b文件夹作为b分支,c文件夹作为c分支,写一个自动转化脚本来实现,自动创建git仓库,自动svn迁移到git,自动合并成需要的分支。或者是a,b,c三个文件夹对应三个分支,不需要master分支也可以使用下面的脚本。svn结构如下
需求
现在工作中遇到这样的情况,有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
更多推荐
所有评论(0)