githubリポジトリ移行方法を出来る限り調べて実際にやってみた
もしかしたら仕事でgithubリポジトリの移行をするかもしれないので、移行方法やgitコマンドについて真剣に調べました。
(あくまでも個人的に調べただけなので他の方法も存在すると思います)
目次
リポジトリ移行の方法
移行の方法は大きく分けて3つあります。
git clone
する際に--mirror
オプションを使用する方法- リポジトリのpush先を変更する方法
- 公式ドキュメントに沿って移行する方法
実際に移行手順を確認するために試してみました。
1. git clone
する際に--mirror
オプションを使用する方法
僕もリポジトリ移行で調べるまでまったく知らなかったのですが git clone
コマンドには様々なオプションが存在するようです。
その中の1つが--mirror
オプションです。
% git clone --help | grep mirror (git)-[master] [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] --mirror Set up a mirror of the source repository. This implies --bare. Compared to --bare, --mirror not only maps local branches of the --mirror is given)
このコマンドはgithubリポジトリのバックアップを取るコマンドのようです。
実際にリポジトリで試してみました。
# mirrorコマンドでリポジトリをclone % git clone --mirror https://github.com/xxx/xxx.git Cloning into bare repository 'xxx.git'... remote: Counting objects: 16, done. remote: Compressing objects: 100% (11/11), done. remote: Total 16 (delta 3), reused 15 (delta 2), pack-reused 0 Unpacking objects: 100% (16/16), done. Checking connectivity... done. [~/Documents/gitWorkSpace/aa] # lsコマンドでディレクトリ確認 % ls xxx.git
どうやら.git
という拡張子で取得するようで、これがリポジトリのバックアップになります。
そして、mirror
オプション付きで予め作成しておいたリモートリポジトリを指定してpushします。
# mirrorオプション付きで予め作成しておいたリモートリポジトリを指定してpush git push --mirror http:///xxx.git
これで新しいリモートリポジトリに移行が完了しています。
なぜかは分からないのですが移行元リポジトリがPRを出している状態で移行手順を行うと
push時にエラーになります
ただエラーになったからと言って特にリポジトリ移行が失敗するというわけではないような気がします。
こことかここを見れば何か分かるかもしれません。
実際に表示されたエラー↓
% git push --mirror https:xxx.git Counting objects: 10, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (10/10), 902 bytes | 0 bytes/s, done. Total 10 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), done. To https:xxx.git * [new branch] master -> master ! [remote rejected] refs/pull/3/head -> refs/pull/3/head (deny updating a hidden ref) ! [remote rejected] refs/pull/3/merge -> refs/pull/3/merge (deny updating a hidden ref) error: failed to push some refs to 'https://xxx.git'
2. リポジトリのpush先を変更する方法
手順としては
という手順です。こちらも実際に試したので下記に記します。
# 移行元からcloneしてくる % git clone https://xxx.git Cloning into 'xxx'... remote: Counting objects: 9, done. remote: Compressing objects: 100% (4/4), done. remote: Total 9 (delta 1), reused 9 (delta 1), pack-reused 0 Unpacking objects: 100% (9/9), done. Checking connectivity... done.
# 移行元のリポジトリからすべてのリモートブランチをローカルにチェックアウトする git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | bash
# remoteURLの向き先を移行先に変更 % git remote set-url origin https://xxx2.git
# 全てのブランチをリモートにpush git push origin --all # 全てのタグをリモートにpush git push origin --tags
これで新しいリモートリポジトリに移行が完了しています。
3. 公式ドキュメントに沿って移行する方法
実はこの方法だけ実際には試していません。 一応公式にドキュメントなどは載っていたので、URLなどを記載しておきます。
公式ドキュメントを読む限り、GitHub.comからGHEに移行する方法は書かれているのですが、逆に GHEからGitHub.comに移行する方法は書かれていないようです。
(見落としてたらすみません)
まとめ
実際にいくつか移行テストを行ってみたのですが
「1. git clone
する際に--mirror
オプションを使用する方法」
が一番手軽かなーという感想です。
ただこの方法はPRを出している最中に移行するとよく分からないエラーが出るのでそこだけ不安ですね。。
安全を一番重視するなら
「2. リポジトリのpush先を変更する方法」で良いんじゃないかなと思います。