目次
はじめに
元々あるリポジトリのソース、コミット履歴、ブランチ、タグ情報を引き継いで新規にリポジトリを立ち上げます。
「ずっとハイブリッドアプリとして開発してきたけどPWA化するのでcordova関連のファイルは削除する。プロジェクト構成が大幅に変わるし、既存のハイブリッドアプリも暫く保守しなきゃいけないのでリポジトリを分けたい。でもコミット履歴やブランチは引き継ぎたい。」
こんなケースを想定しています。以下、旧awsome-appリポジトリを元に、新wonderful-appリポジトリを立ち上げる想定の内容です。
①以外は全て開発用PCで行います。
環境
- GitLab 11.5.4-ee(CentOS7.3)
- 開発用PC(Windows10)
引っ越し開始
①GitLabで引っ越し先リポジトリを作っておく
「New Project」で新リポジトリを作り、「http://gitlabのURL/グループ/新リポジトリ.git」でアクセス出来るようにしておきます。
②旧リポジトリのミラーリポジトリを開発用PCに作る
このケースのミラーリポジトリは一時的なものなので名前はなんでも構いません。
git clone –mirror http://gitlabのURL/グループ/旧リポジトリ.git tmp
C:\src
$ git clone --mirror http://gitlabのURL/グループ/awesome-app.git tmp
Cloning into bare repository 'tmp'...
remote: Enumerating objects: 104, done.
remote: Counting objects: 100% (104/104), done.
remote: Compressing objects: 100% (48/48), done.
Receiving objects: 78% (82/104) d 79 (delta 41)
Receiving objects: 100% (104/104), 90.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (58/58), done.
③ミラーリポジトリに入って内容物を確認
cd tmp
C:\src
$ cd tmp
.gitの内容物が作られています。ソースは有りませんがawesome-appのブランチ、タグ、コミット履歴は全て含まれている状態です。
C:\src\tmp
$ dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 58F9-9911 です
C:\src\tmp のディレクトリ
2019/05/28 19:26 <DIR> .
2019/05/28 19:26 <DIR> ..
2019/05/28 19:26 221 config
2019/05/28 19:25 73 description
2019/05/28 19:25 23 HEAD
2019/05/28 19:25 <DIR> hooks
2019/05/28 19:25 <DIR> info
2019/05/28 19:25 <DIR> objects
2019/05/28 19:25 1,304 packed-refs
2019/05/28 19:25 <DIR> refs
4 個のファイル 1,621 バイト
6 個のディレクトリ 8,160,526,336 バイトの空き領域
④remote originのURLを新リポジトリに向ける
ミラー内容のpush先を新リポジトリに向けます。
git remote set-url origin http://gitlabのURL/グループ/新リポジトリ.git
C:\src\tmp
$ git remote set-url origin http://gitlab1のURL/グループ/wonderful-app.git
⑤新リポジトリにミラー内容をpush
gitの構成情報を新リポジトリにpushします。これだけで新規リポジトリには、.git以外のソースや他資源もpushされます。
git push –mirror origin
C:\src\tmp
$ git push --mirror origin
Counting objects: 104, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (104/104), 90.28 KiB | 0 bytes/s, done.
Total 104 (delta 58), reused 104 (delta 58)
remote: Resolving deltas: 100% (58/58), done.
To http://gitlabのURL/グループ/wonderful-app.git
* [new branch] 1-angular-ionic -> 1-angular-ionic
* [new branch] 2-cameramodel-cameraoptions-correctorientation -> 2-cameramodel-cameraoptions-correctorientation
* [new branch] 3-typedoc -> 3-typedoc
* [new branch] 4-fileremovemodel -> 4-fileremovemodel
* [new branch] 6-confirmdialogmodel -> 6-confirmdialogmodel
* [new branch] 7-confirmdialogmodel -> 7-confirmdialogmodel
* [new branch] 8-confirmdialogmodel -> 8-confirmdialogmodel
* [new branch] 9-enablebackdropdismiss -> 9-enablebackdropdismiss
* [new branch] master -> master
* [new branch] refs/merge-requests/1/head -> refs/merge-requests/1/head
* [new branch] refs/merge-requests/2/head -> refs/merge-requests/2/head
* [new branch] refs/merge-requests/3/head -> refs/merge-requests/3/head
* [new branch] refs/merge-requests/4/head -> refs/merge-requests/4/head
* [new branch] refs/merge-requests/5/head -> refs/merge-requests/5/head
* [new branch] refs/merge-requests/6/head -> refs/merge-requests/6/head
* [new branch] refs/merge-requests/7/head -> refs/merge-requests/7/head
* [new branch] refs/merge-requests/8/head -> refs/merge-requests/8/head
* [new branch] refs/merge-requests/9/head -> refs/merge-requests/9/head
(*)この時、pushするPOSTデータサイズが大きいと以下のエラーが発生するかも知れません。
$ git push --mirror origin
Counting objects: 5479, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (1505/1505), done.
Writing objects: 100% (5479/5479), 18.26 MiB | 0 bytes/s, done.
Total 5479 (delta 3739), reused 5479 (delta 3739)
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
error: RPC failed; HTTP 501 curl 22 The requested URL returned error: 501 Not Implemented
Everything up-to-date
その場合はホームディレクトリ/.gitconfigファイルに以下のように追加して再度pushし直してください。
[http]
postBuffer = 500M
⑥新リポジトリからcloneしてくる
cloneしたいディレクトリに移動して新リポジトリをcloneします。
git clone http://gitlabのURL/グループ/新リポジトリ.git
C:\src\tmp
cd ..
C:\src
$ git clone http://gitlabのURL/グループ/wonderful-app.git
Cloning into 'wonderful-app'...
remote: Enumerating objects: 104, done.
remote: Counting objects: 100% (104/104), done.
remote: Compressing objects: 100% (31/31), done.
Receiving objects: 73% (76/104) d 104 (delta 58)Receiving objects: 69% (72/104)
Receiving objects: 100% (104/104), 90.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (58/58), done.
まとめ
ミラーリポジトリは元リポジトリの変更を任意で反映、追従してバックアップやCIに使うのが主な用途です。
変更を反映、追従しない。と割り切れば成果物、git履歴要素を引き継いだ新リポジトリへの引っ越し手段としても使えます。
リポジトリを引っ越しする時は履歴ごと引っ越ししないと、「この変更いつ入ったっけ?」とか「このコード入れたの誰?」とblameしたりすることが出来なくなってしまい、後で後悔するかも知れません。
–mirrorで引っ越せばそういったことも無くなります。