一、先来聊一聊迁移的思路,不管是gogs迁移至gitlab,还是gitlab迁移至gogs,亦或gitlab迁移至gitlab,手动迁移的步骤都是如下图所示(在gitlab上新建一个空项目就会有这样的提示),

1.进入项目的仓库,删除原来的远程地址(在第一步这块我用的命令是git remote rm origin)

2.新指定新的远程地址

3.上传所有本地分支至新的远程地址

4.上传所有tag至新的远程地址

cd existing_repo
git remote rm origin
git remote add origin git@47.100.168.158:zhouyou/zytest.git
git push -u origin --all
git push -u origin --tags
二、所有项目迁移的话,那就必须脚本来实现,实现步骤
1.获取所有要迁移项目的访问地址
a.这块我用了一个相对比较耗时的办法(notepad++使用熟练的话十分钟就能搞定),在gogs服务器上获取每个人创建的项目,如下图,在gogs对应的data目录下有所有员工的姓名

b.然后使用命令tree -L 2(从当前目录向下查看两级目录,没有tree命令的请执行yum install tree -y),如图可以看到每个用户下面的项目,把这些全部复制粘贴到notepad++上(其他文本编辑器也可以),

c.在文本编辑器上将其整理成如下图格式,访问的地址gogs.haha.local是固定的(每个公司的域名都不一样,也有可能是ip),后面是用户和项目名称组成,都是有规律可循的。红框处前面是用户名后面是密码,脚本clone时会用到(此处需要注意,需要将一个通用的用户添加到所有项目中,如图所示我的gogsamdin用户就在所有项目中)

d.然后在对图三的数据进行格式调整,调整成python认识的列表数据,如图所示(notepad++都可以快捷实现,看自己对文本编辑器的使用程度)

2.获取到所有项目的访问地址后,我们需要把所有项目clone至本地的一个目录
3.克隆完成后,要对每个项目的所有分支进行checkout,因为上传分支的时候只会将本地所存在的分支上传至远程地址,不存在的不上传。clone完成后本地只有一个master分支,需要想办法获取远程所有分支名称然后checkout一遍
4.checkout完成后,就可以删除旧的源(origin),新增新的源,并把分支和tag上传至新的源
下面附上脚本,一个是python,一个是shell脚本
PS:先执行python脚本,脚本执行完成之后再执行shell脚本,shell脚本的存放目录和gog-to-gitlab3是同一级
gogs_to_gitlab.py
#coding=utf-8
# @Time:2019/7/26 16:52
# @Author:ZHOUYOU
# from git import Repo
# import os
from git import Repo
import git
import os
rep_list  =  ['http://gogsadmin:123456$1@gogs.haha.local/masibin/fec-device','http://gogsadmin:123456$1@gogs.haha.local/masibin/fec-install','http://gogsadmin:123456$1@gogs.haha.local/zhangyan/fec-cms']
path = 'D:\gogs-to-gitlab3'
for i in rep_list:
    #从列表中获取每个项目的项目名称,并创建对应文件夹
    folder = i.split('/',-1)[4]
    print(folder)
    folder_name = './'+folder
    os.mkdir(path+folder_name)
    Repo.clone_from(url=i,to_path=path+folder_name)

    #获取远程分支的分支名称
    repo = git.Repo(path+folder_name)
    remote_branches = []
    for ref in repo.git.branch('-r').split('\n'):
        remote_branches.append(ref)
    print(remote_branches)
    del remote_branches[0]
    print(remote_branches)

    #获取分支名称
    bran_name = []
    for bran in remote_branches:
        print(bran.split('/',-1)[1])
        bran_name.append(bran.split('/',-1)[1])
    print(bran_name)

    #在本地切换一遍分支,因为在上传至新的gitlab库时,只会把已存在的本地分支上传,没有的不会上传,所以必须把所有分支都切换一遍
    for bran in bran_name:
        repo.git.checkout(bran)
#!/bin/sh 
cd gogs-to-gitlab3
for i in `ls`;
do 
echo ======into $i
cd $i
git remote rm origin
git remote add origin http://ip:port/XXXX/$i.git(此处根据自己实际情况填写地址)
git push -u origin --all
git push -u origin --tags
cd ..
done

 

 

 

 

 

 

 

 

 

 
posted on 2019-07-29 17:19  linkenzhou  阅读(3661)  评论(0编辑  收藏  举报