問題
GitHubでホストされているリポジトリLinearModels
で,同僚とリモートおよび/またはローカルで作業をしているとします. 現在のリポジトリで開発が進行中ですが,上司から現時点での履歴を保持したまま, Gitlabリポジトリhttps://gitlab.econometrics.com/EXAMPLE-USER/NEW-REPOSITORY.git
にミラーリングするよう依頼されました.
解決策: git clone --bare
▶ 手順
- リポジトリのベアクローンを作成
- 新しいリポジトリにミラーpush
- 一時的な古いローカルリポジトリを削除
▶ コマンド
# ステップ1
% git clone --bare https://github.com/EXAMPLE-USER/LinearModels.git
# ステップ2
% cd LinearModels.git
% git push --mirror https://gitlab.econometrics.com/EXAMPLE-USER/NEW-REPOSITORY.git
# ステップ3
% cd ..
% rm -rf LinearModels.git
REAMRKS
- 通常の
git clone
はスナップショットと履歴の両方をローカルマシンにダウンロードしますが,git clone --bare
は履歴のみをコピーするため,新しいリモートリポジトリへの転送が迅速に行えます. - また,ベアリポジトリから通常のリポジトリを作成することもできます.ほとんどの場合,push先の新しいリポジトリは通常のリポジトリである必要があります.
- ミラーリングプロセスはローカルと新しいリモートリポジトリ間の通信を通じて行われるため,古いリモートリポジトリは新しいリポジトリの通知や更新を受け取りません.
なぜ通常のgit clone
と git push --mirror
を使わないのか?
git clone <origin-url>
を実行すると,すべてのタグがコピーされ, リモートブランチorigin/master
を追跡するローカルブランチmaster(HEAD
)と,リモート ブランチorigin/test1
,origin/test2
,origin/test3
が作成されます.
通常のクローンリポジトリに対してgit push --mirror
を実行すると,mirrorは全てを意味するため, リモートブランチorigin/test1
,origin/test2
,origin/test3
もpushされます. その結果,origin/origin/test1
という名前のブランチが作成されてしまいます.