「GitLab」にあるリポジトリを「GitHub」に移行する機会があったので、その時に実施した手順を記事としてまとめました。
GitLabからGitHubへの移行を行う手順

GitLabからGitHubへの移行手順について、順を追って説明していきます
手順としては、以下のように進めていきます。
- STEP1GitHubに空リポジトリを作成する
- STEP2ソースコードおよび変更履歴を移行する
- STEP3MR(マージリクエスト)や、Issue(イシュー)を移行する
GitHubに空リポジトリを作成する
まず、GitHubに空リポジトリを作成します。Ownerおよび公開範囲等は任意で指定。
個人でしか使わないリポジトリであれば、チームメンバーの紐付けは行う必要はありませんが、他の方も使う場合は、「Settings」の「Manage access」で権限設定を行っておきます。
ソースコードおよび変更履歴を移行する
空リポジトリをGithub上に作成した後は、cloneとpushを行い、ソースコードおよび変更履歴をGitHub へ移行します。
# ミラーリポジトリとしてGitLabの移行対象リポジトリをクローンする
$ git clone --mirror git@your-gitlab-site.com:username/repo.git
# 上記実施後、repo.gitディレクトリが出来るのでそちらに移動
$ cd repo.git
# pre-commitを無視して、GitHubへpush(ローカルの内容をそのままリモートに複製している)
$ git push --no-verify --mirror git@github.com:username/repo.git
これでGitHubには、ソースコードや変更履歴が反映されているはずです。
念の為、デフォルトブランチを確認しておきましょう。pushした時に、デフォルトブランチがGitLabで設定していたものと違う場合があるので。
確認方法としては、「Settings」→「Branches」に移動すると「Default Branch」があるので、そちらに記載されているブランチがデフォルトのブランチになっています。
次に、リポジトリのアップストリームURLを変更します。
# アップストリームURLを確認すると、GitLabのURLになっていることを確認
$ git remote -v
# アップストリームURLをGitHubのURLに設定
$ git remote set-url origin git@github.com:username/repo.git
# アップストリームURLがGitHubのURLになっていることを確認
$ git remote -v
MR(マージリクエスト)や、 Issue(イシュー)を移行する
ソースコードや変更履歴はGitHub側に移行することができましたが、まだMRやIssueに関しては移行することが出来ていません。
そこで、https://github.com/piceaTech/node-gitlab-2-github を使って、MRやIssueの移行を進めていきます。
まず、事前準備としてGitLabの読み取り用トークンと、GitHubの書き込み用トークンを用意しておきます。
GitLab側に関しては、こちら https://gitlab.com/profile/personal_access_tokens から、Nameを「node-gitlab-2-github」などにしておいて、「Expired at」も適当につけておきます。
指定する権限に関しては、「api」と「read_repository」を指定します。
GitHub 側に関しては、こちら https://github.com/settings/tokens から、Noteを「node-gitlab-2-github」などにしておきます。
指定する権限に関しては、「repo」を指定します。それぞれトークンを忘れないように控えておきましょう。
ここまで準備が済んだら、node-gitlab-2-githubを使い、MRやIssueの移設を行っていきます。
# node-gitlab-2-githubをクローン
$ git clone https://github.com/piceaTech/node-gitlab-2-github.git
$ cd node-gitlab-2-github
$ npm install
$ cp sample_settings.ts settings.ts
続いて、settings.ts
ファイルを編集していきます。
import Settings from './src/settings';
export default {
gitlab: {
url: '{{ https://gitlab.mycompany.com }}',
token: '{{ GitLabで先ほど発行したトークン }}',
projectId: null,
},
github: {
owner: '{{ repository owner (user or organization) }}',
token: '{{ GitHubで先ほど発行したトークン }}',
repo: '{{ GitHub側のリポジトリ名 }}',
},
usermap: {
'{{ GitLab側のユーザー名(user1) }}': '{{ GitHub側のユーザー名(user1) }}',
'{{ GitLab側のユーザー名(user2) }}': '{{ GitHub側のユーザー名(user2) }}',
},
projectmap: {
},
conversion: {
useLowerCaseLabels: true,
},
transfer: {
milestones: true,
labels: true,
issues: true,
mergeRequests: true,
},
debug: false,
usePlaceholderIssuesForMissingIssues: true,
useReplacementIssuesForCreationFails: true,
useIssuesForAllMergeRequests: false,
filterByLabel: null,
skipMatchingComments: [],
mergeRequests: {
logFile: './merge-requests.json',
log: false,
},
} as Settings;
settings.ts
ファイルを上記のように編集し終えたら、一度プロジェクトを実行します。
$ npm start
プロジェクトを実行するとリポジトリIDとリポジトリ名が表示されるので、リポジトリIDを控えておきます。
その後、settigs.ts
ファイルのprojectIdに、先ほど控えたリポジトリIDを設定。
import Settings from './src/settings';
export default {
gitlab: {
url: '{{ https://gitlab.mycompany.com }}',
token: '{{ GitLabで先ほど発行したトークン }}',
projectId: {{ リポジトリID }},
},
リポジトリIDを設定し終えたら、プロジェクトを再実行します。
$ npm start
上手くいけば、MRやIssueがGitHubに移行されています!
他のリポジトリも移設したい場合は、projectIdとGitHub側のrepo名を変更してあげて、プロジェクトを実行してあげると、MRおよびIssueを移行することが出来ます。
GitHubへの移行が完了し、fetchやpush等が問題なく行えるか確認することが出来たら、GitLabのリポジトリは削除しておきましょう!
コメント