写点什么

从 Gitee 到极狐 GitLab 的迁移指南

作者:极狐GitLab
  • 2022 年 1 月 27 日
  • 本文字数:8613 字

    阅读完需:约 28 分钟

由于极狐 GitLab 目前暂时未提供通过“一键式”来完成 Gitee 到极狐 GitLab 的迁移,但是可以利用 Gitee 的 API(导出方)、极狐 GitLab 的 API(导入方)以及 git 命令来快速完成项目从 Gitee 到极狐 GitLab 的迁移。


整体的迁移可以分为三步:仓库的迁移、Issue 与 PR 的迁移以及最后用户的迁移


Repo 迁移

前期准备


  • Gitee 账号、Demo Repo(本例为 https://gitee.com/majinghe/dev-ops)

  • 极狐 GitLab 账号(本文以正在内测、即将上线的极狐 GitLab SaaS 为例,地址为 https://jihulab.com)

Repo 迁移


在极狐 GitLab 创建新项目时,选择 import-project



在出现的界面中选择 Repo by URL:



接着需要输入需要导出的 Gitee Repo 地址以及 Gitee 账号对应的用户名和密码:



最后点击 Create project 即可开始 Gitee 项目的迁移。随后可以在极狐 GitLab 实例界面看到导入的项目:



由于 Gitee 会对 Repo 的路径加分隔符 '-'(比如 DevOps 变成 dev-ops,DevSecOps 变成 dev-sec-ops,AISecOps 变成 aisec-ops 等等),最终会导致迁移过来的 Project 名称里面会包含空格,这一点需要注意,在点击 Create project 按钮之前最好检查一下 Project 名称。



此外,在迁移的时候可以选择将 Gitee 的项目迁移到极狐 GitLab 的用户名下还是某个 Group/Subgroup 下面。



下面先选择将 Gitee Repo 迁移到极狐 GitLab 的用户(不在某一个特定的 Group/Subgroup)下面,最后在演示 Gitee Organization 迁移的时候会选择迁移到特定的 Group/Subgroup。


Issue 迁移


上述方法只迁移了代码库到极狐 GitLab 实例,但是并没有把 Issue 及 Pull Request 迁移过来。下面演示一下如何把 Issue 迁移过来。Demo Issue 如下图所示:



Issue 的迁移主要分两步:从 Gitee 导出,然后导入极狐 GitLab。


从 Gitee 导出 Issue


使用如下的 API 可以直接导出对应项目的 Issue:


$ curl -X GET --header 'Content-Type: application/json;charset=UTF-8' \ 'https://gitee.com/api/v5/repos/your-gitee-username/your-gitee-repo/issues?access_token=gitee-personal-access-token&state=open'
复制代码


只要把 your-gitee-username/your-gitee-rep 以及 gitee-personal-access-token 进行真实值替换即可。返回值如下:


[  {    "id": 7900642,    "url": "https://gitee.com/api/v5/repos/majinghe/dev-ops/issues/I4PC6A",    "repository_url": "https://gitee.com/api/v5/repos/majinghe/dev-ops",    "labels_url": "https://gitee.com/api/v5/repos/majinghe/dev-ops/issues/I4PC6A/labels",    "comments_url": "https://gitee.com/api/v5/repos/majinghe/dev-ops/issues/I4PC6A/comments",    "html_url": "https://gitee.com/majinghe/dev-ops/issues/I4PC6A",    "parent_url": null,    "number": "I4PC6A",    "parent_id": 0,    "depth": 0,    "state": "open",    "title": "Test issue",    "body": "This is a test issue.",    ......太长,保留演示所需要的内容......  }]
复制代码


在返回值中可以得到 title 、 body 等内容。这些值是 issue 的中重要内容,需要导入极狐 GitLab。


由于上述命令并不能列取出 issue 中的 comment,所以需要再用如下命令获取该 issue 对应的 comment:


$ curl -X GET --header 'Content-Type: application/json;charset=UTF-8' \  'https://gitee.com/api/v5/repos/majinghe/dev-ops/issues/issue-id/comments?access_token=gitee-personal-access-token'
复制代码


返回值如下:


[  {    "id": 8159705,    "body": "Add some new comment!",    ......太长,保留演示所需要的内容......    "created_at": "2022-01-04T22:08:43+08:00",    "updated_at": "2022-01-04T22:08:43+08:00"  }]
复制代码


body 即为 issue 对应的 comment 内容。


把 Issue 导入极狐 GitLab


使用如下命令,将 Gitee Repo issue 的 title 以及 body 导入到迁移过来的极狐 GitLab Project:


$ curl --request POST --header "PRIVATE-TOKEN: jh-personal-access-token" \  "https://gitlab.cn/api/v4/projects/project-id/issues?title=Title-Content&description=Issue-body"
复制代码


参数说明:


  • PRIVATE-TOKEN:极狐 GitLab Personal Access Token;

  • project-id:导入过来的极狐 GitLab Project ID;

  • title:issue title 内容;

  • description:issue body 内容;


极狐 GitLab Personal Access Token 的获取方法参考如下视频:


<iframe src="//player.bilibili.com/player.html?aid=722916326&bvid=BV1aD4y1F7Ji&cid=477944670&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
复制代码


极狐 GitLab Project ID 可以直接在极狐 GitLab Project 获取:



可以看到 Project ID 为 13689。


使用上述信息,将以上面的 issue 用如下命令导入:


$ curl --request POST --header "PRIVATE-TOKEN: jh-personal-access-token" \"https://gitlab.cn/api/v4/projects/13689/issues?title=Test%20issue&description=This%20is%20a%20test%20issue."
复制代码


返回值如下:


{  "id": 64292,  "iid": 1,  "project_id": 13689,  "title": "Test issue",  "description": "This is a test issue.",  "state": "opened",  "created_at": "2022-01-05T16:39:49.742+08:00",  "updated_at": "2022-01-05T16:39:49.742+08:00",    ......太长,保留演示所需要的内容......}
复制代码


在极狐 GitLab Project 上面可以看到 issue 已经导入成功:



再用如下命令导入 issue comment 即可:


curl --request POST --header "PRIVATE-TOKEN: jh-personal-access-token" \"https://gitlab.cn/api/v4/projects/13689/issues/1/notes?body=Add%20some%20new%20comment\!" 
复制代码


返回结果如下:


{  "id": 391898,  "type": null,  "body": "Add some new comment!",  "attachment": null,  "author": {    "id": 204,    "username": "majinghe",    "name": "JingHe Ma",    "state": "active",    "avatar_url": "https://gitlab.cn/uploads/-/system/user/avatar/204/avatar.png",    "web_url": "https://gitlab.cn/majinghe"  },  "created_at": "2022-01-05T16:49:48.092+08:00",  "updated_at": "2022-01-05T16:49:48.092+08:00",    ......太长,保留演示所需要的内容......}
复制代码


继续查看 issue 界面:



至此 issue 也从 Gitee 迁移到了极狐 GitLab。接下来进行 PR 的迁移。


Pull Request 迁移

方法一:在极狐 GitLab 界面上直接操


当将仓库从 Gitee 迁移到极狐 GitLab 的时候,所有的 branch 也被迁移过来了,在极狐 GitLab 界面上可以查看到:



可以看到 Gitee 上用于创建 PR 的四个分支(demo,demo-1,demo-2,demo-3,分别对应四个 PR)都存在,接下来只需要在极狐 GitLab 界面上创建相应的 PR 即可:



重复相同的操作即可完成 PR 的全部创建,结果如下:



可以看到已经完成了 PR 的顺利迁移。


方法二:git 命令来完成 PR 迁移


git 命令的迁移本质是对于 git 的操作,需要对于 git 原理、代码托管有比较深的认识。核心原理就是找到 Gitee PR 所对应的 commit 信息,然后用 cherry-pick 将 commit 信息提交到极狐 GitLab 的新建分支上,然后创建 PR 即可。下面进行演示。


首先 clone Gitee Repo 到本地:


$ git clone git@gitee.com:majinghe/dev-ops.git
复制代码


进入代码目录,查看远端分支:


$ git remote -vorigin  git@gitee.com:majinghe/dev-ops.git (fetch)origin  git@gitee.com:majinghe/dev-ops.git (push)
复制代码


接下来将迁移过来的极狐 GitLab 库添加为上述库的远端仓库:


$ git remote add jh git@gitlab.cn:majinghe/jh-devops.git
复制代码


接着查看上述仓库的远端分支并拉取分支信息:


$ git remote -vjh  git@gitlab.cn:majinghe/jh-devops.git (fetch)jh  git@gitlab.cn:majinghe/jh-devops.git (push)origin  git@gitee.com:majinghe/dev-ops.git (fetch)origin  git@gitee.com:majinghe/dev-ops.git (push)
$ git fetch jh mainFrom gitlab.cn:majinghe/jh-devops * branch main -> FETCH_HEAD * [new branch] main -> jh/main
复制代码


可以看到极狐 GitLab 的 Project 已经为 Gitee Repo 的远端仓库了。接着先获取 Gitee PR 所对应的 source branch 上的 commit 信息即可:


$ git ck demo$ git logcommit 024b3fac1751c03cbaa9ac54f24edd2aa3ac7957 (HEAD -> demo, origin/demo)Author: majinghe <devops008@sina.com>Date:   Tue Jan 4 09:49:12 2022 +0000
update demo.sh.
commit d70e3443357b6d497c489da78efe97610d242806 (origin/master, origin/HEAD, jh/main, master)Author: majinghe <devops008@sina.com>Date: Tue Jan 4 09:47:36 2022 +0000
add demo.sh file.
commit df7aa835192c9846f69c0bef1f90e2173fdc2bb4Author: majinghe <devops008@sina.com>Date: Tue Jan 4 09:45:22 2022 +0000
复制代码


其中第一个 commit 即为创建 PR 的代码变更,记住 commit id:024b3fac1751c03cbaa9ac54f24edd2aa3ac7957。然后将代码切回到极狐 GitLab 远端仓库分支:


$ git ck -b jh-demo jh/main
复制代码


上述命令基于极狐 GitLab 远端仓库(jh)的 main 分支,新建了一个 jh-demo 分支,接下来使用 cherry-pick 命令将 Gitee PR 分支上的 commit 提交到极狐 GitLab 的 jh-demo 分支上:


$ git cherry-pick 024b3fac1751c03cbaa9ac54f24edd2aa3ac7957[jh-demo 66d67ca] update demo.sh. Author: majinghe <devops008@sina.com> Date: Tue Jan 4 09:49:12 2022 +0000 1 file changed, 1 insertion(+), 1 deletion(-)
复制代码


然后将代码推送到极狐 GitLab 远端仓库即可:


$ git push jh jh-demoEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Delta compression using up to 16 threadsCompressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 328 bytes | 328.00 KiB/s, done.Total 3 (delta 1), reused 1 (delta 0), pack-reused 0remote:remote: To create a merge request for jh-demo, visit:remote:   https://gitlab.cn/majinghe/jh-devops/-/merge_requests/new?merge_request%5Bsource_branch%5D=jh-demoremote:To gitlab.cn:majinghe/jh-devops.git * [new branch]      jh-demo -> jh-demo
复制代码


最后可以在极狐 GitLab 界面上看到提交的代码:



点击创建 Merge Request 即可:



最终完成 Gitee Pull Request 到极狐 GitLab Merge Request 的迁移:



方法三:用 API 来迁移 PR


可以用如下 API 查看到 Gitee 上 PR 的变更内容:


$ curl -X GET --header 'Content-Type: application/json;charset=UTF-8' \'https://gitee.com/api/v5/repos/your-gitee-username/your-gitee-repo/pulls/1/files?access_token=gitee-personal-access-token'
复制代码


返回结果如下:


[  {    "sha": "024b3fac1751c03cbaa9ac54f24edd2aa3ac7957",    "filename": "demo.sh",    "status": null,    "additions": "1",    "deletions": "1",    "blob_url": "https://gitee.com/majinghe/dev-ops/blob/024b3fac1751c03cbaa9ac54f24edd2aa3ac7957/demo.sh",    "raw_url": "https://gitee.com/majinghe/dev-ops/raw/024b3fac1751c03cbaa9ac54f24edd2aa3ac7957/demo.sh",    "patch": {      "diff": "@@ -1,3 +1,3 @@\n #!/bin/bash\r\n \r\n-echo \"Hello World!!!\"\n\\ No newline at end of file\n+echo \"Hello World!!!,this is xiaomage\"\n\\ No newline at end of file\n",      "new_path": "demo.sh",      "old_path": "demo.sh",      "a_mode": "100644",      "b_mode": "100644",      "new_file": false,      "renamed_file": false,      "deleted_file": false,      "too_large": false    }  }]
复制代码


可以看到该 PR 变更的文件为 demo.sh,变更内容为:


"diff": "@@ -1,3 +1,3 @@\n #!/bin/bash\r\n \r\n-echo \"Hello World!!!\"\n\\ No newline at end of file\n+echo \"Hello World!!!,this is xiaomage\"\n\\ No newline at end of file\n",
复制代码


也即把 "Hello World!!!" 变更为了 "Hello World!!!,this is xiaomage"。


接着用极狐 GitLab 的如下 API 创建一个 commit:


PAYLOAD=$(cat << 'JSON'{  "branch": "demo",  "commit_message": "some commit message",  "actions": [    {      "action": "update",      "file_path": "demo.sh",      "content": "echo \"Hello World!!!,this is xiaomage\""    }  ]}JSON)
$ curl --request POST --header "PRIVATE-TOKEN: jh-personal-access-token" --header "Content-Type: application/json" \ --data "$PAYLOAD" "https://gitlab.cn/api/v4/projects/13689/repository/commits"
复制代码


上述命令在 demo 分支上添加一个 commit,内容为更新 demo.sh 文件,内容变更为 "echo "Hello World!!!,this is xiaomage"。上述命令的返回结果为:


{  "id": "2086ce1d8bf2774bd2da8f79962b72fda974f0ba",  "short_id": "2086ce1d",  "created_at": "2022-01-05T14:07:27.000+00:00",  "parent_ids": [    "19978f8a29b19a368509d3563533cccb108bca88"  ],  "title": "some commit message",  "message": "some commit message",  "author_name": "JingHe Ma",  "author_email": "jhma@gitlab.cn",  "authored_date": "2022-01-05T14:07:27.000+00:00",  "committer_name": "JingHe Ma",  "committer_email": "jhma@gitlab.cn",  "committed_date": "2022-01-05T14:07:27.000+00:00",  "trailers": {},  "web_url": "https://gitlab.cn/majinghe/jh-devops/-/commit/2086ce1d8bf2774bd2da8f79962b72fda974f0ba",  "stats": {    "additions": 0,    "deletions": 0,    "total": 0  },  "status": null,  "project_id": 13689,  "last_pipeline": null}
复制代码


可以看到 commit 信息为:https://gitlab.cn/majinghe/jh-devops/-/commit/2086ce1d8bf2774bd2da8f79962b72fda974f0ba。可以看到的内容如下:



接着用如下命令创建 Merge Request 即可:


$ curl --request POST --header "PRIVATE-TOKEN: jh-personal-access-token" \"https://gitlab.cn/api/v4/projects/13689/merge_requests?source_branch=demo&target_branch=main&id=13689&title=migration%20demo%20pr" | jq .
复制代码


返回结果如下:


{  "id": 32125,  "iid": 3,  "project_id": 13689,  "title": "migration demo pr",a  "description": null,  "state": "opened",  "created_at": "2022-01-05T22:11:29.058+08:00",  "updated_at": "2022-01-05T22:11:29.058+08:00",  "merged_by": null,  "merged_at": null,  "closed_by": null,  "closed_at": null,  "target_branch": "main",  "source_branch": "demo",  "user_notes_count": 0,  "upvotes": 0,  "downvotes": 0,  "author": {    "id": 204,    "username": "majinghe",    "name": "JingHe Ma",    "state": "active",    "avatar_url": "https://gitlab.cn/uploads/-/system/user/avatar/204/avatar.png",    "web_url": "https://gitlab.cn/majinghe"  },  "assignees": [],  "assignee": null,  "reviewers": [],  "source_project_id": 13689,  "target_project_id": 13689,  "labels": [],  "draft": false,  "work_in_progress": false,  "milestone": null,  "merge_when_pipeline_succeeds": false,  "merge_status": "checking",  "sha": "2086ce1d8bf2774bd2da8f79962b72fda974f0ba",  "merge_commit_sha": null,  "squash_commit_sha": null,  "discussion_locked": null,  "should_remove_source_branch": null,  "force_remove_source_branch": null,  "reference": "!3",  "references": {    "short": "!3",    "relative": "!3",    "full": "majinghe/jh-devops!3"  },  "web_url": "https://gitlab.cn/majinghe/jh-devops/-/merge_requests/3",  "time_stats": {    "time_estimate": 0,    "total_time_spent": 0,    "human_time_estimate": null,    "human_total_time_spent": null  },  "squash": false,  "task_completion_status": {    "count": 0,    "completed_count": 0  },  "has_conflicts": false,  "blocking_discussions_resolved": true,  "approvals_before_merge": null,  "subscribed": true,  "changes_count": "1",  "latest_build_started_at": null,  "latest_build_finished_at": null,  "first_deployed_to_production_at": null,  "pipeline": null,  "head_pipeline": null,  "diff_refs": {    "base_sha": "d70e3443357b6d497c489da78efe97610d242806",    "head_sha": "2086ce1d8bf2774bd2da8f79962b72fda974f0ba",    "start_sha": "d70e3443357b6d497c489da78efe97610d242806"  },  "merge_error": null,  "user": {    "can_merge": true  }}
复制代码


此时在极狐 GitLab Merge Request 界面上可以看到创建的 MR:



用户的迁移


由于 Gitee 也有 Organization 的概念,Organization 下面可以添加用户。下面以 https://gitee.com/xiaomage-devops/dev-ops.git 为例演示整个迁移过程。


可以用如下命令 list 出某个 Gitee Organization 下的 user 信息为:


$ curl -X GET --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/orgs/organization-name/members?access_token=gitee-personal-access-token'
复制代码


输入 Organization 名称以及 Gitee personal access token,即可列取出该 Organization 下面的 user。返回值如下:


[  {    "id": 146619,    "login": "hiveer",    "name": "hiveer",    ......太长,保留迁移所需信息......    "type": "User",    "member_role": "member"  },  {    "id": 9684289,    "login": "majinghe",    "name": "majinghe",    ......太长,保留迁移所需信息......    "type": "User",    "member_role": "admin"  },  {    "id": 10292540,    "login": "tiaotiaott",    "name": "tiaotiao",    ......太长,保留迁移所需信息......    "type": "User",    "member_role": "member"  }]
复制代码


可以看到有三个 user 信息。将上述 list 出的 user 信息作信息匹配(如果需要,比如为了方便识别用户,确定对应用户的 email 等),然后可以将用户加入到极狐 GitLab 中。可以找 Admin 人员在极狐 GitLab 界面上添加 user,也可以利用下面的 API 直接调用 API 添加。不管是哪种方法,都需要确定有 Admin 权限或者找 Admin 人员完成


$ curl --request POST --header "PRIVATE-TOKEN: jh-gitlab-personal-acess-token" \       "https://your-jh-gitlab-url/api/v4/users?email=devops008@sina.com&password=user-pasword&username=username&name=name"
复制代码


返回值为:


{  "id": 4,  "username": "xiaomage",  "name": "xiaomage",  "state": "active",  "avatar_url": "https://secure.gravatar.com/avatar/784477b59c09d7731bd613f1c9a5555a?s=80&d=identicon",  "web_url": "https://your-jh-gitlab-url/xiaomage",  "created_at": "2021-12-30T07:44:24.241Z", ...... 太长,删除其他信息......}
复制代码


可以看到 user 添加成功,ID 为 4,username 和 name 都是 xiaomage。可以在极狐 GitLab 界面上看到:



接着可以将上述 user 添加到极狐 GitLab 的 Group 中(极狐 GitLab 用 Group/Subgroup 来对 Project 进行多层级安全管理)。此 Group/Subgroup 用来对应 Gitee 中要迁移过来的 Organization。可以在极狐 GitLab 上创建一个 Group:


$ curl --request POST \--url "https://gitlab.cn/api/v4/groups" \--header "PRIVATE-TOKEN: jh-personal-access-token" \--header "Content-Type: application/json" \--data '{"name": "xiaomage-devops", "path": "xiaomage-devops", "description": "Create Group using API" }'
复制代码


返回值如下:


{  "id": 5149,  "web_url": "https://gitlab.cn/groups/xiaomage-devops",  "name": "xiaomage-devops",  "path": "xiaomage-devops",  ......太长,保留演示所需要的内容......}
复制代码


名为 xiaomage-devops 的 Group 已经创建起来了,在极狐 GitLab 实例界面上可以看到:



接下来,将 user 添加到 Group 中,可以在极狐 GitLab 界面上,直接添加:



也可以用如下的 API 进行添加:


$ curl --request POST --header "PRIVATE-TOKEN: jh-personal-access-token" \     --data "user_id=user-id&access_level=30" "https://gitlab.cn/api/v4/groups/your-group-id/members"
复制代码


将需要添加的 user 的 user-id 以及极狐 GitLab token、目的 Group 替换完毕,执行命令即可。可在极狐 GitLab 界面上,看到新增了一个用户:



接下来就可以把 Gitee Organization 下面的项目按照最开始的方法迁移过来,在导入的时候可以选择要导入的目的 Group/Subgroup:



选择完毕,点击 Create Project 即可完成项目导入,结果如下:



接着就可以用上面的方法导入其他的 Repo 以及对应的 Issue 与 PR 了。


至此,已经完成了 Gitee 到极狐 GitLab 的迁移,赶快开启你的极狐 GitLab 之旅吧!

发布于: 刚刚阅读数: 2
用户头像

极狐GitLab

关注

开源开放,人人贡献 2021.05.19 加入

开放式一体化DevOps平台,助力行业高速协同增长!

评论

发布
暂无评论
从 Gitee 到极狐GitLab 的迁移指南