【Git/GitHub】リポジトリの依存関係を引き継がない!GitHubでリポジトリを完全複製する方法

自身のGitHubリポジトリをバックアップして新しいリポジトリとしたいことはたまにあるかなと思います。計画性のない私とってはよくあります。漠然とforkすればいいのかなと思っていました。

機能的にはこれでもいいのですが、forkの場合には厳密にいうと以下のような点で注意が必要です。

厳密には複製先(新)のリポジトリには複製元(旧)のリポジトリの依存関係が維持されています。ということで、依存関係をなくしてコピーを行うにはどうしたらいいかということを調べてみたところ今回の内容に行き着きました。

GitHubで自分のリポジトリを複製して新しいリポジトリを作成するには?

この場合にはforkではなくmirror cloneを使用します。そんな機能初めて知ったよ🤔

mirror cloneとは?

通常の通常のclonemirror 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を使うことで、より目的に合った形でリポジトリの複製ができるようになりました。

どちらかというと、コミットのメッセージが雑なので公開時に見せたくないなあという対策でした🤗🤗🤗

/* -----codeの行番号----- */