Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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 と何らかわりなく使うことができるようになり、あなたのオープンソースプロジェクトとして運営していくことができるようになります。

移行先GitHub リポジトリ(仮名) git@github.com:Taro/PublicProject.git
移行元Git リポジトリ taro@tarosserver.example.com:/path/to/PrivateProject.git
ローカル環境 Ubuntu 15.10
  • 移行元リポジトリからすべてのブランチをcheckout する
    Git_MoveRepoToGithub0000.png

  • 移行先GitHub リポジトリへすべてのブランチとtag をpush する
    Git_MoveRepoToGithub0001.png

GitHub に移行先となる空リポジトリの作成

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

移行元リポジトリのclone

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

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

すべてのリモートブランチをローカルにチェックアウトする

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

移行元のリポジトリからすべてのリモートブランチをローカルにチェックアウトする
# 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 で新しいリモートを追加します。

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 先として追加する例です。

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 します。
コマンドは以下のようになります。

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

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

参考

gitで子ブランチ全部ひっくるめて別のサーバーに移動する方法(gitレポジトリー移転)
http://lab.bizreach.co.jp/762/
Clone all remote branches with Git?
http://stackoverflow.com/questions/67699/clone-all-remote-branches-with-git
TsutomuNakamura
Linux 好きなプログラマです。 コミュニケーションはお気軽にしていただけると幸いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした