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

- 環境
    - Windows10 64bit
    - git version 2.18.0.windows.1

# 1.GitHubのサイトで新規にリポジトリを作成する
1. [Repositories]タブにある[New]ボタンを押下する![スクリーンショット 2019-05-31 19.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/2727de8b-450e-c5b0-1b18-c2a411bd7d1b.png)
2. [Repository name]を入力して[Create repository]ボタンでリポジトリを作成する![スクリーンショット 2019-05-31 19.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/fb1be254-3ac6-9144-4682-05ad8b44c291.png)

# 2.`移行元`をミラーリングでクローンする
```bash
# 移行元をミラーでクローンする
$ 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先に`移行先`を設定する
```bash
# 移行元へ移動
$ 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 コマンドの使い方と、主要オプションまとめ](http://www-creators.com/archives/1272#-p_w_hyphenprune)

# 4.`移行元`リポジトリにプルリクがある場合は、`git config`でプルリクを除外する
実際にはやっていません・・・なので`push`で`remote rejected`メッセージが出力されました。
マージされているかどうかは関係ありません。
[Git Howto: Mirror a GitHub repo without pull refs | Christoph Rüegg](http://christoph.ruegg.name/blog/git-howto-mirror-a-github-repository-without-pull-refs.html)

# 5.`移行先`へプッシュする
```bash
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/e5a4e7f0-a513-0357-1b82-320f5e7e19cf.png)
### 2段階認証を設定していると聞かれるので答える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/91369c60-1998-d282-a7c8-194a3b66953c.png)


## `refs/pull`で`remote rejected`メッセージが出ても気にしない!でいいと思う
プルリクがあったリポジトリでは`refs/pull`で`remote rejected`が出ます。

> なぜかは分からないのですが移行元リポジトリがPRを出している状態で移行手順を行うと push時にエラーになります
> ただエラーになったからと言って特にリポジトリ移行が失敗するというわけではないような気がします。
[githubリポジトリ移行方法を出来る限り調べて実際にやってみた - エンジニアはこわくない](http://tsujitaku50.hatenablog.com/entry/2017/01/08/200155)

```bash
 ! [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](https://stackoverflow.com/questions/34265266/remote-rejected-errors-after-mirroring-a-git-repository)

### ところで`refs`って何？
> Git では、これらは "参照（references）" ないしは "refs" と呼ばれます。SHA-1のハッシュ値を含んでいるファイルは .git/refs ディレクトリ内に見つけることができます。現在のプロジェクトでは、このディレクトリに何もファイルはありませんが、シンプルな構成を持っています。
> [Git - Gitの参照](https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%81%AE%E5%8F%82%E7%85%A7)

# 参考サイト
- [GitHub に リポジトリを移行する方法 - Qiita](https://qiita.com/TKR/items/43b2677f6385308c7c4a)
- [Git: リモートのリポジトリを別のリモートリポジトリへコピーする - Qiita](https://qiita.com/ysti/items/be67a6e3c5754fac088a)
- [手元にあるGit リポジトリをGitHub のリポジトリへ移行する - Qiita](https://qiita.com/TsutomuNakamura/items/058cb851a61bbb1f715b)