みなさん、こんにちは。
GitHub を使っていて「あれ?」と思ったことはありませんか? そう、自分が所有しているプライベートリポジトリを、自分のアカウント内に Fork することはできないのです。
これは GitHub の仕様で、2026 年現在も変わっていません。「自分のものは自分のもの、わざわざ分身を作る必要はないでしょ?」という設計思想なのかもしれませんが、実際の開発現場では困るケースが多々ありますよね。
- 元のリポジトリは「正解」として残し、別ラインで大胆な改造をしたい
- 実験用に環境を完全に切り離したコピーを作りたい
- 過去の履歴やタグをすべて保持したまま、新しいリポジトリとして再出発したい
「Fork ボタンが押せないなら詰みか……」と諦める必要はありません。Git の仕組みを正しく使えば、コマンド数行で「完全な複製(疑似 Fork)」は簡単に作れます。
今回は、GitHub の UI に頼らず、Git の標準機能をフル活用してリポジトリを丸ごとコピーする方法を解説します。
全体の流れ(3 ステップ)
やることは非常に簡単。以下の 3 ステップです。
- 元リポジトリを
--mirrorでクローンする - GitHub で新しい空のプライベートリポジトリを作る
- クローンした中身を新リポジトリへ
--mirrorでプッシュする
実はこの手法、以前ご紹介したリポジトリをインポートする方法と同じ原理です。
外部サーバーから持ってくるのも、GitHub 内部で複製するのも、Git のレイヤーで見れば同じ「リポジトリの移行」なんですね。
元リポジトリを mirror clone する
まず、コピー元のプライベートリポジトリをクローンします。ここで重要なのが --mirror オプションです。
git clone --mirror https://github.com/username/original-private-repo.git
なぜ --bare ではなく --mirror なのか?
Git に詳しい方なら「--bare(作業ディレクトリを持たないクローン)でいいのでは?」と思うかもしれません。しかし、疑似 Fork においては --mirror が正解です。
--bare.gitディレクトリの中身だけをコピーします。--mirror
全ブランチ、全タグに加え、refs/以下のすべての情報(リモート追跡ブランチなど)をそのままの形でコピーし、プッシュ先でもそれを維持しようとします。
つまり、「リポジトリの完全な鏡(ミラー)」を作るための専用オプションなのです。これにより、コミットハッシュひとつ変えずに移行が可能になります。
GitHub で新しいプライベートリポジトリを作成
次に、GitHub の Web 画面から受け皿となるリポジトリを作ります。
- リポジトリ名
任意(例:new-private-repo) - 公開設定
Private - 注意点
README や .gitignore は作成しない(完全に空の状態にする)
作成後、新しいリポジトリの URL(https://github.com/username/new-private-repo.git)を控えておきましょう。
push 先を変更して mirror push する
いよいよ仕上げです。先ほどクローンしたディレクトリ(.git で終わる名前になっています)に移動し、プッシュ先を新リポジトリに書き換えます。
cd original-private-repo.git
# プッシュ先を新しいリポジトリにセット
git remote set-url origin https://github.com/username/new-private-repo.git
# すべての情報を一気に流し込む!
git push --mirror
これで完了です!新リポジトリを確認してみてください。ブランチもタグも、そして何よりこれまでの苦労が詰まったコミット履歴も、すべてが完璧に再現されているはずです。
Fork できなくても道はある
GitHub の「自分のリポジトリは Fork できない」という制限は、一見不便に思えますが、今回のような Git 本来の機能を使えばより柔軟に対応できます。
- 履歴がすべて残る(誰がいつ何をしたか失われない)
- タグやリリース情報も保持される
- GitHub の UI に依存しないので、他の Git サービスへの移行にも応用できる
実験的な開発をしたいときや、プロジェクトをブランチ管理ではなく「リポジトリ単位」で切り出したいときは、ぜひこの --mirror 戦略を使ってみてください。
本日も最後までお読みいただきありがとうございました。
それでは、よい開発ライフを!



