🦔

Git リポジトリの複製

に公開

概要

Gitの履歴を保持したまま、別リポジトリにコピーする方法です。
まず、元のリポジトリをミラーでクローンし、次にリモートURLを新しいリポジトリに変更し、最後に変更を新しいリポジトリにプッシュします。

手順

新しいリポジトリの作成 (GitHub、codeCommit上)

ミラークローン

git clone --mirror https://github.com/user/original_repo.git
cd original_repo.git

リモートURLの変更

git remote set-url origin https://github.com/user/new_repo.git

プッシュ

git push --mirror origin

詳細

  1. 新しいリポジトリの作成
    移行先のGitHubやcodeCommitで新しいリポジトリを作成します。

  2. ミラークローン
    元のリポジトリをミラーでクローンします。
    これにより、すべてのブランチとタグを含む完全な履歴がコピーされます。
    下記のコマンドを実行すると <リポジトリ名>.gitディレクトリが作成されます。

git clone --mirror <元のリポジトリのURL>
  1. リモートURLの変更
    クローンしたリポジトリの.gitディレクトリに移動し、リモートURLを新しいリポジトリに変更し
    ます。
# 移動
cd <クローンしたリポジトリ名>.git
# リモートurlの変更
git remote set-url origin <新しいリポジトリのURL>
# 変更できたか確認
git remote -v 
  1. プッシュ
    変更を新しいリポジトリにプッシュします。
    ミラープッシュを使用すると、すべてのブランチとタグが新しいリポジトリにコピーされます。
git push --mirror origin

補足

--mirror オプションの意味は、ローカルリポジトリのすべての参照(refs)をリモートにそのままミラーリングするということです。つまり、ブランチ、タグ、リモート追跡ブランチなど、refs/ 以下のすべてを一括でプッシュします。
※ プロジェクトの /.git/refs/ ディレクトリ

ミラークローンは、ローカルリポジトリを一旦作成し、それをリモートにプッシュする形式で、履歴を保持したまま移行する方法です。

既存のローカルリポジトリがある場合は、リモートURLを新しいリポジトリに変更することで、既存のローカル環境を新しいリポジトリに紐づけることができます。

移行元と移行先のブランチ名が異なる場合は、マージやリネームなどの操作が必要になる場合があります。

Discussion