自身のGitHub
のリポジトリをバックアップして新しいリポジトリとしたいことはたまにあるかなと思います。計画性のない私とってはよくあります。漠然とfork
すればいいのかなと思っていました。
機能的にはこれでもいいのですが、fork
の場合には厳密にいうと以下のような点で注意が必要です。
厳密には複製先(新)のリポジトリには複製元(旧)のリポジトリの依存関係が維持されています。ということで、依存関係をなくしてコピーを行うにはどうしたらいいかということを調べてみたところ今回の内容に行き着きました。
GitHub
で自分のリポジトリを複製して新しいリポジトリを作成するには?
この場合にはfork
ではなくmirror clone
を使用します。そんな機能初めて知ったよ🤔
mirror cloneとは?
通常の通常のclone
とmirror clone
の主な違いは以下の通りです。
- 通常のclone:作業用のリポジトリを作成し、デフォルトブランチのみを取得
- mirror clone:全てのブランチ、タグ、リファレンスを完全コピー
GitHub
でリポジトリを手動で複製して新しいプロジェクトを作成する方法は以下の通りです。
1.新しい空のリポジトリの作成
GitHub
のウェブサイトで右上の【+】ボタンをクリックし 、プルダウンで表示された【New repository】ボタンをクリック
以下の画面に遷移したら
項目を入力していきます。
- リポジトリ名【Repository name】を入力
- 必要であれば説明【description】を追加
- プライバシー設定【Public/Private】のラジオボタンを選択
- Initialize this repository withの【Add a README file】のチェックを外す
上記の設定を行った後【Create repository】ボタンをクリック
2. 既存リポジトリの複製
作業用の一時ディレクトリを作成します。
$ mkdir temp-clone $ cd temp-clone
mirror clone
の作成し、cloneしたディレクトリに移動します。mirror clone
は通常のgit clone
コマンドに--mirror
オプションをつけます。
$ git clone --mirror 【複製元(旧)のリポジトリのURL(末尾git)】 $ cd 【クローンしたディレクトリ】
複製先(新)のリポジトリにpush
します。
$ git push --mirror 【複製先(新)のリポジトリのURL(末尾git)】
これで、依存関係の無い新しいリポジトリの複製ができました。
3. 一時ディレクトリ・ファイルの削除
mirror clone
で使用したディレクトリやファイルは不要なので削除していきます。
cd ../.. rm -rf temp-clone
履歴も消す場合には
実は、ここまでの作業で複製先(新)のリポジトリができましたが、この状態では複製元(旧)のリポジトリのコミット履歴
はそのままです。もし、これもクリアする場合には以下のようにします。
# 新しいリポジトリを通常クローン $ git clone 【複製先(新)のリポジトリのURL(末尾git)】 $ cd 【クローンしたディレクトリ】 # 全ブランチの削除(mainを除く) $ git branch -r | grep -v 'main$' | sed 's/origin\///' | xargs -I {} git push origin --delete {} # 履歴を削除して、.gitを初期化して開始 $ rm -rf .git $ git init $ git add . $ git commit -m "Initial commit" $ git branch -M main # リモートの設定と強制プッシュ $ git remote add origin 【複製先(新)のリポジトリのURL(末尾git)】 $ git push -f origin main # すべてのタグを削除 $ git tag | xargs git push origin --delete
これで完全クリーンなリポジトリの複製が出来上がりました。
おわりに
今回はGitHub
でリポジトリのバックアップを作成するときにはfork
ではなくmirror clone
を使用する方法について書きました。
今回は、GitHub
のリポジトリを複製する方法として、一般的によく知られているfork
ではなく、mirror clone
を使用する方法について書きました。これにより元のリポジトリとの依存関係のない、完全に独立した新しいリポジトリを作成(複製)することができます。
この方法は以下のような場合に有用です。
- 既存プロジェクトをベースに新しいプロジェクトを開始したい
- リポジトリのバックアップを作成したい
- プロジェクトの完全な複製を作成し、新しい状態で開発を始めたい
また、必要に応じてコミットの履歴
やタグ
のクリアできるため、まっさらな状態にできます。
この方法を知る前は漠然とfork
を使用していましたが、mirror clone
を使うことで、より目的に合った形でリポジトリの複製ができるようになりました。
どちらかというと、コミットのメッセージが雑なので公開時に見せたくないなあという対策でした🤗🤗🤗