他のGitからGitHubへ移行する方法


  • 環境


    • Windows10 64bit

    • git version 2.18.0.windows.1




1.GitHubのサイトで新規にリポジトリを作成する


  1. [Repositories]タブにある[New]ボタンを押下するスクリーンショット 2019-05-31 19.25.08.png

  2. [Repository name]を入力して[Create repository]ボタンでリポジトリを作成するスクリーンショット 2019-05-31 19.29.51.png


2.移行元をミラーリングでクローンする

# 移行元をミラーでクローンする

$ git clone --mirror {移行元リポジトリURL}
Cloning into bare repository '移行元'...
remote: Counting objects: 8351, done.
remote: Compressing objects: 100% (2499/2499), done.
remote: Total 83512 (delta 4413), reused 7766 (delta 3996)
Receiving objects: 100% (8351/8351), 6.65 MiB | 1.20 MiB/s, done.
Resolving deltas: 100% (4413/4413), done.


3.Push先に移行先を設定する

# 移行元へ移動

$ cd {ミラーリングした移行元リポジトリのpath}

# Push先に移行先を設定する
$ git remote set-url --push origin {移行先リポジトリURL}

# 確認する
$ git remote -v
origin {移行元リポジトリURL} (fetch)
origin {移行先リポジトリURL} (push)

# cloneして時がたっている場合は移行元の変更を全部取り込む
$ git fetch --all
Fetching origin


git fetch コマンドの主なオプション

すべてのリモートから fetch する「--all」:設定された、すべてのリモートからすべての履歴を取得します。

ローカルに存在しないブランチを削除する「-p, --prune」:リモートに存在するが、ローカルに存在しないブランチをすべて削除します。

タグを fetch する「-t, --tags」:リモートにあるすべてのタグを取得します。

git fetch コマンドの使い方と、主要オプションまとめ



4.移行元リポジトリにプルリクがある場合は、git configでプルリクを除外する

実際にはやっていません・・・なのでpushremote rejectedメッセージが出力されました。

マージされているかどうかは関係ありません。

Git Howto: Mirror a GitHub repo without pull refs | Christoph Rüegg


5.移行先へプッシュする

$ git push --mirror

Enumerating objects: 83512, done.
Counting objects: 100% (8351/8351), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2082/2082), done.
Writing objects: 100% (8351/8351), 6.65 MiB | 4.4 MiB/s, done.
Total 83512 (delta 4413), reused 83512 (delta 4413)
remote: Resolving deltas: 100% (4413/4413), done.
To {移行先リポジトリURL}
# 省略


コマンドを打つとGitHubの認証情報を聞かれるので答える

image.png


2段階認証を設定していると聞かれるので答える

image.png


refs/pullremote rejectedメッセージが出ても気にしない!でいいと思う

プルリクがあったリポジトリではrefs/pullremote rejectedが出ます。


なぜかは分からないのですが移行元リポジトリがPRを出している状態で移行手順を行うと push時にエラーになります

ただエラーになったからと言って特にリポジトリ移行が失敗するというわけではないような気がします。

githubリポジトリ移行方法を出来る限り調べて実際にやってみた - エンジニアはこわくない


 ! [remote rejected]     refs/pull/9/head -> refs/pull/9/head (deny updating a hidden ref)

error: failed to push some refs to '{移行先リポジトリURL}'


(ざっくり訳)refs/pullで始まる参照は、GitHubによって作成された、合成された読み込み専用の参照であり、他のリポジトリから実際に取得された可能性のある分岐を反映しているため、更新(だからcleanなのです)することはできません。

したがって、実際の参照をすべてプッシュしても、プル要求は更新されません。

GitHubリポジトリをプルリクエストなしでミラーする必要があります。

! [remote rejected] errors after mirroring a git repository - Stack Overflow



ところでrefsって何?


Git では、これらは "参照(references)" ないしは "refs" と呼ばれます。SHA-1のハッシュ値を含んでいるファイルは .git/refs ディレクトリ内に見つけることができます。現在のプロジェクトでは、このディレクトリに何もファイルはありませんが、シンプルな構成を持っています。

Git - Gitの参照



参考サイト