- 環境
- Windows10 64bit
- git version 2.18.0.windows.1
1.GitHubのサイトで新規にリポジトリを作成する
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
でプルリクを除外する
実際にはやっていません・・・なのでpush
でremote 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の認証情報を聞かれるので答える
2段階認証を設定していると聞かれるので答える
refs/pull
でremote rejected
メッセージが出ても気にしない!でいいと思う
プルリクがあったリポジトリではrefs/pull
でremote 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の参照