GitLabのプロジェクトをGitHubのリポジトリへ移行してみた

# はじめに
GitLabからGithubへリポジトリの移行を検討しました。
gitコマンドのみだとブランチとソースはGitHub側へ移動できますが、
IssueはGitHub側へ持っていくことができなそうでした。
よって、node-gitlab-2-githubを使用しIssueの履歴までGitHubへ移行を実施しました。
本記事はGitLabの資産（ソース、ブランチ、コミット履歴、Issue）をGitHubへ移行する際に実施した手順についてまとめたものです。


# 前提
GitLabのグループ内におけるプロジェクトを
GitHubのorganizaiton内へ移動することを想定しています。


# 環境
- vscode
- poewrshell


# ◆ブランチとソースの移行

移行するリポジトリを次のコマンドでローカルにクローンする。

```powershell
git clone --mirror URL
```

:::note warn
git cloneできないとき
gitlabのプロジェクトをクローンすると、503などのエラーが出る時があります。
プロキシの設定回りが怪しいので、.gitcofigファイル等の設定を確認してみてください。
:::


リモートリポジトリにgitlabのプロジェクトが登録されている状態なので、
プッシュ先のリモートリポジトリを変更したい。
リモートリポジトリの変更前に念のため、現在のリモートリポジトリを確認します。

```powershell
git remote -v
```

移行先のGitHub側の空リポジトリを作成し、次のコマンドでプッシュ先のリモートリポジトリをGitHubのリモートリポジトリに変更する。
```powershell
git remote set-url --push origin URL
```

以下のコマンドでpush先がGitHub側のリモートリポジトリに変更されたことを確認します。
```powershell
git remote -v
```

問題なければ下記コマンドでリモートリポジトリにpushします。

```powershell
git push --mirror
```

リモートリポジトリをブラウザで確認し更新されている事を確認します。
GitLab側のブランチ情報も含めてGitHub側にソースを移行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/935a4e9f-def7-84fb-f62d-67856a5af3ca.png)


# ◆Issueを移行する

移行においては下記のOSSを使用します。
こちらのツールを使用することでGitLabのプロジェクトにおけるIssueの履歴をGitHub側に移行できます。

https://github.com/piceaTech/node-gitlab-2-github

### インストール
ドキュメントに記載されている通り下記コマンドでリポジトリをクローンし、
階層を移動した後に、必要なパッケージをインストールします。

```powershell
git clone https://github.com/piceaTech/node-gitlab-2-github.git
cd node-gitlab-2-github
npm i
```

### トークンの発行
ツールの使用においてGitLab、GitHubでそれぞれトークンの発行が必要になります。

:::note warn
発行されたトークンを忘れないように保管しておいてください。
:::

- ### GitLab
Edit Profile > Access Tokens > Add new Token から読み取り専用のトークンを発行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/f52dd0fb-6022-8460-0086-511520ec4236.png)



- ### GitHub
GitHub側もパーソナルアクセストークンを発行します。
`repo`にチェックを入れてアクセストークンを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/49996242-3478-71c0-0e52-abe4829d38fe.png)


### スクリプトの編集
以下のコマンドで`sample_settings.ts`元に、`settings.ts`を作成します。

```powershell
cp sample_settings.ts settings.ts
```

`settings.ts`が作成出来たら内容を編集していきます。

- ### GitLab
`token`：先ほど発行したGitLabのトークン
`projectId`：nullで設定しておきます。（※後で書き換えます）
`url`、`listArchivedProjects`、`sessionCookie`：デフォルトのままにしておきます。詳細はドキュメントを参照ください。

- ### GitHub
`owner`：githubのユーザ名（@から始まる方）
`token`：先ほど発行したGitHubのトークン
`token_owner`：トークンを発行したGitHubのユーザ名
`repo`：リポジトリの名前
`usermap`：使用するGitLabのユーザ名、GitHubのユーザ名
`projectmap`：GitLabのプロジェクト名、 GitHubのリポジトリ名
`baseUrl`、`apiUrl`、`ownerIsOrg`、`recreateRepo`：デフォルトのままにしておきます。詳細はドキュメントを参照ください。

- ドキュメント

https://github.com/piceaTech/node-gitlab-2-github

```typescript:settings.ts
import Settings from './src/settings';

export default {
  gitlab: {
    // url: 'https://gitlab.mycompany.com',
    token: '発行したトークン（GitLab）',
    projectId: null,
    listArchivedProjects: true,
    sessionCookie: "",
  },
  github: {
    // baseUrl: 'https://github.mycompany.com:123/etc',
    // apiUrl: 'https://api.github.mycompany.com',
    owner: 'organization名',
    ownerIsOrg: true,
    token: '発行したトークン（GitHub）',
    token_owner: 'トークンを発行したユーザ名',
    repo: 'gitlab_github_test',
    recreateRepo: false,
  },
  usermap: {
    'GitLabのユーザ名': 'GitHubのユーザ名',
  },
  projectmap: {
    'GitLabのリポジトリ名': 'GitHubのリポジトリ名',
  },
//～～～

} as Settings;

```

ここまで設定出来たら下記コマンドでスクリプトを実行します。
```powershell
npm run start
```

問題なく実行できれば下記のようにプロジェクトID等が出力されます。
```
・・・
プロジェクトID         プロジェクト名   --       null
プロジェクトID         プロジェクト名   --       null
プロジェクトID         プロジェクト名   --       null
・・・
```

`settings.ts`ファイルにおいて、先ほど`null`を指定した`projectId:null`部分を修正します。
`null`部分を表示されたプロジェクトIDに変更します。

```ts
export default {
  gitlab: {
    //～～～
    projectId: プロジェクトID,
    //～～～
},
```

この状態で再度次のコマンドでスクリプトを実行します。
```powershell
npm run start
```

問題なく実行できていれば、私の場合最後に`Transfer complete!`が表示されました。
参考になるか分かりませんが、readmeしかないプロジェクトの移行では1分ほどで終わりました。
```
Transfer complete!
```

GitHub側のリポジトリを確認すると、`issues`が追加されている事を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/29085332-52e6-6c85-7684-cac3f363d3f9.png)