一、先來聊一聊遷移的思路,不管是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