手元にあるGit リポジトリをGitHub のリポジトリへ移行する

# 
今まで色々と検証して本記事を作成しましたが、@ooocamel さんのコメントの通り次のように`--mirror` オプションを使用することで、これらの手順はより短い手順で実施できるようです。

```text:mirrorオプションでGitHubへリポジトリを移行する
# git clone --mirror taro@tarosserver.example.com:/path/to/PrivateProject.git
# git remote set-url --push origin git@github.com:Taro/PublicProject.git
# git push --mirror
```

これより下の記事については`--mirror` オプションを使用しない手順になりますが、参考程度にご覧になるようお願いします。

# 自分の作業環境にあるgit リポジトリをGitHub のリポジトリへと移行する 
自分の作業端末や作業場所内のGit リポジトリからGitHub のリポジトリへ移行する方法について、手順を描いていきたいと思います。
この手順は例えば、プログラム開発初期の頃はまだ他人に見せられないが開発に脂が乗ってきた頃にGitHub の公開リポジトリにプログラムをアップして開発の拠点リポジトリをそちらへ移行するといった方法を取ることができるようになります。

# リポジトリ移行のイメージ 
リポジトリを移行するイメージは、自分の作業端末内に作成したGit リポジトリもしくは作業場所に設置されているLinux サーバなどからリポジトリをclone し、すべてのbranch 及び履歴をGitHub へpush します。
GitHub へpush したあとは通常のGitHub と何らかわりなく使うことができるようになり、あなたのオープンソースプロジェクトとして運営していくことができるようになります。

<table><tbody>
  <tr>
    <th> 移行先GitHub リポジトリ(仮名)</th>
    <td> git@github.com:Taro/PublicProject.git</td>
  </tr>
  <tr>
    <th> 移行元Git リポジトリ</th>
    <td> taro@tarosserver.example.com:/path/to/PrivateProject.git</td>
  </tr>
  <tr>
    <th> ローカル環境</th>
    <td> Ubuntu 15.10</td>
  </tr>
</tbody></table>

* 移行元リポジトリからすべてのブランチをcheckout する
![Git_MoveRepoToGithub0000.png](https://qiita-image-store.s3.amazonaws.com/0/70152/9ea5cd49-2911-6635-278e-64120fe0564e.png)

* 移行先GitHub リポジトリへすべてのブランチとtag をpush する
![Git_MoveRepoToGithub0001.png](https://qiita-image-store.s3.amazonaws.com/0/70152/f8224042-26c5-b354-5d9d-497ac7fd912b.png)

# GitHub に移行先となる空リポジトリの作成 
GitHub に空のリポジトリを作成します。
名前は構成概要の通り`PublicProject` としておきます。
手順については割愛します。

# 移行元リポジトリのclone 
移行元となるリポジトリをclone します。


```text:移行元のリポジトリをcloneする
# git clone taro@tarosserver.example.com:/path/to/PrivateProject.git
```


# すべてのリモートブランチをローカルにチェックアウトする 
下記コマンドを実行してorigin のリポジトリ上にあるブランチをすべてローカルにチェックアウトします。
下記コマンドはリモートとしてorigin のみ存在することを想定しています。
既に複数のリモートが登録されている場合、うまく動作しないので注意してください。


```text:移行元のリポジトリからすべてのリモートブランチをローカルにチェックアウトする
# 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
```


# remote の変更 
push/fetch 先リポジトリをGitHub のものに変更します。
push/fetch 先を変更するには`git remote rm` コマンドでリモートを削除してから`git remote add` で新しいリモートを追加します。


```text:push/fetch先を変更する例
# git remote rm origin
# git remote add origin git@github.com:Taro/PublicProject.git
```


## 移行元と移行先GitHub リポジトリの両方にpush できる環境を作成したい場合 
上記の手順でorigin を削除しましたが、移行元のリポジトリのほうがネットワーク帯域が良いなどの理由でGitHub と今までのリポジトリを両方使いたい場合は、GitHub のリポジトリ側を別名で登録しておくこともできます。
例えば以下はGitHub のリポジトリを`github` をリモートのpush/fetch 先として追加する例です。


```text:GitHubリポジトリを別名で追加する
# git remote add github git@github.com:Taro/PublicProject.git
# git remote -v
github  git@github.com:Taro/PublicProject.git (fetch)
github  git@github.com:Taro/PublicProject.git (push)
origin  taro@tarosserver.example.com:/path/to/PrivateProject.git (fetch)
origin  taro@tarosserver.example.com:/path/to/PrivateProject.git (push)
```


このようにすることで、`git push origin $branch_name` とすることで、今まで使用していたリポジトリにデータをpush することができるし、`git push github $branch_name` とすることでGitHub 上のリポジトリにコミットすることができるようになります。
普段の細かい作業はwork ブランチを作成して自分の作業場にあるリポジトリへcommit/push し、キリの良い所までできたらGitHub 上のリポジトリへcommit/push するといった使い方もできるようになります。

# GitHub 上のリポジトリへブランチとタグをpush する 
ローカルにあるブランチとタグをすべてGitHub 上へpush します。
コマンドは以下のようになります。


```text:ローカルにあるブランチとタグをpushする
# git push origin --all
# git push origin --tags
```


以上でGitHub へのリポジトリ移行は完了です。

# 参考 
<dl>
  <dt> gitで子ブランチ全部ひっくるめて別のサーバーに移動する方法(gitレポジトリー移転)</dt>
  <dd> http://lab.bizreach.co.jp/762/</dd>
</dl>

<dl>
  <dt> Clone all remote branches with Git?</dt>
  <dd> http://stackoverflow.com/questions/67699/clone-all-remote-branches-with-git</dd>
</dl>