リモートリポジトリを自分のリモートリポジトリとして複製する

自分、または他人のリモートリポジトリを開発履歴やすべてのブランチ、タグごと別の自分のリモートリポジトリとして複製する方法です。
公開されているプログラムを自分用に編集して使用したい場合などに使います。
../../_images/01027.png

GitHubにはフォーク(Fork)という機能があり、これをつかうと簡単にリポジトリの複製が可能で元のリポジトリからの変更の取得も可能とかなり便利なのですが以下の特徴があります。

  • リポジトリの持ち主にフォークをしたことが伝わる

  • フォークはそのリポジトリへ貢献するという意思表示になる場合がある

  • 公開されているリポジトリを非公開(Private)にすることはできない( フォークの可視性について

そこでこのページでは上記を無視してリモートリポジトリを複製する方法をまとめます。 最終的な状態のイメージ図を以下に示します。

../../_images/02024.png

全体の流れ

  1. 複製元リポジトリをベアリポジトリとしてローカルにクローン

  2. 空のリポジトリを作成(複製されたリポジトリの場所となる)

  3. ローカルにクローンしたベアリポジトリを1.で作成した空リポジトリにプッシュ

  4. ローカルにノンベアリポジトリをクローン

  5. 複製元リポジトリから変更を取得できるようにする

今回はiRIC softwareに同梱されている Nays2DH というソルバーのリポジトリを複製してみます。

1 複製元リポジトリをベアリポジトリとしてローカルにクローン

まずはローカル(=自分のPC)の任意のフォルダに複製元のリポジトリをベアリポジトリとしてクローンします。

ヒント

ベアリポジトリ とは作業ディレクトリを持たないリポジトリを指します。
普段ローカルで作業する際にクローンして作成されるローカルリポジトリは作業ディレクトリを持ち ノンベアリポジトリ といいます。

複製元のリポジトリのURLをコピー

まずは複製したいリポジトリのページにアクセスします。
今回は Nays2DH のリポジトリにアクセスします。

Nays2DH https://github.com/iRICsolvers/v4_Nays2DH

../../_images/03023.png

リポジトリのページにアクセスしたら Code からリポジトリのURLを表示して、コピーします。

複製元のリポジトリをクローン

URLをコピーしたらリポジトリのクローンを行います。今回はTortoiseGitを使用してクローンを行います。
任意のフォルダをエクスプローラーで開いて右クリックメニューから Gitクローン(複製)... を選択してTortoiseGitを起動します。
../../_images/04018.png

TortoiseGitの画面が出てきたら Bareリポジトリにクローン にチェックをいれ、 URL の欄に先ほどコピーしたURLが入っていることを確認して OK をクリックしてクローンを実行してください。

../../_images/05017.png

問題なくクローンできたら以下のように「成功」と表示されます。

../../_images/06015.png

先ほどのフォルダの中にリポジトリが作成されています。

../../_images/07016.png

中身を見てみるとベアリポジトリなので、普段のノンベアリポジトリでは .git フォルダの中に入っているものが直接入っていることがわかります。

../../_images/08014.png

2 GitHubで空のリモートリポジトリを作成

次に先ほどクローンしたリポジトリをプッシュするためのリポジトリをGitHubに新しく作成します。作り方は 新規リモートリポジトリの作成 をご確認下さい。

リポジトリを作成

今回はリポジトリの名前を複製元と同じNays2DHにしました。この名前は任意で入力して問題ありませんが、複製したものだと分かるようにしておくと事故が起きにくいかと思います。

../../_images/09011.png

リポジトリが作成されるとこのような画面に切り替わります。
水色の部分に表示されているリポジトリのURLをコピーしておきましょう。
../../_images/1008.png

GitHub Actionをオフにする

複製元のリポジトリによってはGitHub Actionsが設定されている場合があります。(今回のNays2DHにも設定されています)
予期せぬ動作を招いてもいやなので予めGit Actionを実行しない設定にしておきましょう。

ヒント

GitHub ActionsとはGitHub上でプログラムのビルドなど様々なことを自動でしてくれる機能です。

  • 先ほどのリポジトリのページ右上にある歯車アイコンの Settings から設定画面を開く

  • 設定画面左側のメニューの Actions ‣ General からGit Actionの設定項目を表示

  • Actions Permissions で Disable actions を選択して下部の Sav をクリックして設定を保存

../../_images/1105.png

3 ローカルにクローンしたベアリポジトリを空リポジトリにプッシュ

手順1でローカルにクローンした複製元のベアリポジトリを手順2で作成した自分のリポジトリにプッシュします。

まずは手順1でクローンしたリポジトリをエクスプローラーで開き、右クリックメニューの Git Bash Here でGit Bashを開きます。

../../_images/1205.png

Git Bashが起動したら以下のコマンドを入力し Enter で実行します。

git push --mirror [push先のリモートリポジトリのURL]
<push先のリモートリポジトリのURL>には先ほど手順2でコピーしておいたリポジトリのURLを入力します。
よって私の場合以下のようになります。
git push --mirror git@github.com:starfieldKt/Nays2DH.git

ヒント

Git Bashにコマンドをペーストする方法は以下があります。

  • マウスホイールを押し込み

  • 右クリック ‣ paste

  • Shift + Insert


コマンドを実行して以下のように表示されれば成功です。

../../_images/1304.png

手順2で作成したリポジトリのページを開いていましょう。複製元と同じ内容になっていることが確認できるかと思います。

../../_images/1405.png

コミットもしっかり複製されています。

../../_images/1504.png

4 ローカルにノンベアリポジトリをクローン

手順3まででリポジトリの複製自体は終了です。ですがこのままだと作業が出来ないので複製したリモートリポジトリをローカルにクローンしましょう。 クローンの方法は リモートリポジトリをクローンする を確認してください。

手順1でローカルにクローンした複製元のベアリポジトリはもう使わないので消してしまいましょう。

5 複製元リポジトリから変更を取得できるようにする

リポジトリを複製後に複製元のリポジトリに変更があった時などにコミットを複製元リポジトリから複製後のリポジトリに持ってこれるように設定をします。

Gitではひとつのローカルリポジトリに対して複数のリモートリポジトリを設定し、任意のリモートリポジトリと情報の取得や登録を行うことができます。
手順4でクローンしたローカルリポジトリは現在、複製後のリモートリポジトリのみと紐づいている状態なので、複製元のリモートリポジトリへの設定も追加してあげます。
まずは手順4でローカルにクローンしたローカルリポジトリをエクスプローラーで開きます。
開いたら 右クリック ‣ TortoiseGit ‣ 設定 からTortoiseGitの設定画面を開きます。
../../_images/1604.png

設定画面を開いたら リモート 画面を表示します。
リモート画面には恐らく origin と表示されていると思います。この origin をクリックすると右側の リモートURL に情報が表示されます。
../../_images/1703.png

このリモートというものは他のリポジトリとの接続情報を保存したもので、ブックマークのようなものです。
このリモートにリモートリポジトリのURLを登録しておくと、プッシュやフェッチの際にURLではなくそのリモートリポジトリの名前を指定することが出来るようになります。
それではリモートに複製元のリポジトリのリポジトリを追加で設定しましょう。
リモート に任意の名前、 URL に複製元リポジトリのURLを入力して 新規追加/保存 ボタンを押します。

ヒント

複製元のリポジトリ(上流のリポジトリ)のリモートの名前は upstream とするのが一般的だそうですが、区別できる名前であればなんでもよいです。

../../_images/1804.png

ダイアログが出てきますが、タグの方は いいr 、フェッチの方は はい で大丈夫です。

../../_images/1902.png
../../_images/2001.png

フェッチをするための画面が出てくるので OK をクリックして実行します。

../../_images/2101.png

成功と表示されればOKです。 閉じる で画面を閉じます。

../../_images/2201.png

これで複製元のリポジトリのをupstreamという名前で登録することができました。 今後はupstreamを対象に指定してフェッチを実行すれば複製元のリポジトリから変更を取得することが出来ます。

../../_images/2301.png

おまけ コマンドラインで行う手順

今回はコマンドラインでの操作が苦手な人向けに極力Gitクライアントを使用しましたが、コマンドラインを使用した方が慣れると早いです。 今回の一連の操作をコマンドラインで行う手順を紹介します。

手順2の新規リモートリポジトリの作成は予め終わらせているものとします。

1 GitBashでリポジトリを作成したいディレクトリを開きます。

git clone --bare [複製元のリポジトリURL]

2 クローンしたリポジトリのディレクトリに移動して複製先リポジトリにプッシュします。

cd [クローンした複製元リポジトリのディレクトリ]
git push --mirror [複製先リポジトリのURL]

3 ひとつ上の階層に戻って複製元のローカルベアリポジトリを消します。

cd ..
rm -rf [クローンした複製元リポジトリのディレクトリ]

4 複製先のリポジトリをクローンします

git clone [複製先リポジトリのURL]

5 複製先のローカルリポジトリのリモートに複製元リポジトリを追加

cd [クローンした複製先のリポジトリのディレクトリ]
git remote add [追加するリモートリポジトリ名] [追加したいリポジトリ]

6 複製元リポジトリからフェッチ

git fetch [複製元リポジトリのリモート名]