エンジニアはこわくない

好きなように書く

githubリポジトリ移行方法を出来る限り調べて実際にやってみた


スポンサーリンク

f:id:tsujitaku50:20170107105906p:plain

もしかしたら仕事でgithubリポジトリの移行をするかもしれないので、移行方法やgitコマンドについて真剣に調べました。

(あくまでも個人的に調べただけなので他の方法も存在すると思います)

目次

リポジトリ移行の方法

移行の方法は大きく分けて3つあります。

  1. git cloneする際に--mirrorオプションを使用する方法
  2. リポジトリのpush先を変更する方法
  3. 公式ドキュメントに沿って移行する方法

実際に移行手順を確認するために試してみました。

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してくる
  • 移行元のリポジトリからすべてのリモートブランチをローカルにチェックアウトする
  • pushする先を変更する
  • 全てのブランチ、全てのタグをリモートに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先を変更する方法」で良いんじゃないかなと思います。