Gitオブジェクトを共有して、リモートリポジトリーをクローンする
「Gitオブジェクト」を共有して、「リモートリポジトリー」をクローンします。「リモートリポジトリー」をクローンする時、リポジトリーで最もHDDの容量を消費する「Gitオブジェクト」を「ローカルリポジトリー」にコピーせず、直接「リモートリポジトリー」の「Gitオブジェクト」を参照します。
通常はコピーもしくはハードリンク
通常「ローカルプロトコル」を使用して「リモートリポジトリー」をクローンすると、「Gitオブジェクト」は、コピーもしくはハードリンクで「Gitオブジェクト」を「ローカルリポジトリー」に配置します。「Gitオブジェクト」を共有すると、「リモートリポジトリー」クローン時に「Gitオブジェクト」のコピーやハードリンクを行いません。
「ローカルリポジトリー」で「Gitオブジェクト」が必要になった時は、「リモートリポジトリー」の「Gitオブジェクト」を直接参照するようになります。
クローン時のGitオブジェクトを共有
共有する「Gitオブジェクト」は、クローン時の「Gitオブジェクト」が対象です。「ローカルリポジトリー」で行ったコミットは、直接「リモートリポジトリー」に反映されることはありません。
コミット等で「ローカルリポジトリー」に生成した「Gitオブジェクト」は、「ローカルリポジトリー」に配置されます。
そうしないと、バージョン管理が破綻するためです。
参照先のGitオブジェクトがなくなることがある
一般的なファイルのシンボリックリンクもそうですが、シンボリックリンクの参照先のファイルが削除されると、そのファイルにアクセスできなくなります。この事情は「Gitオブジェクト」を共有して作成した「ローカルリポジトリー」も同じです。
クローン後、「リモートリポジトリー」でブランチを削除したりリベースを行うと、不要になった「Gitオブジェクト」が削除されます。
この時、「ローカルリポジトリー」は必要な「Gitオブジェクト」にアクセスできなくなり、「ローカルリポジトリー」は破綻します。
この状況に備えるには、「リパック」して「リモートリポジトリー」から「Gitオブジェクト」をダウンロードしておくなど、別途作業が必要になります。
従って、この方法で「リモートリポジトリー」をクローンする際は、十分に注意してください。
オプションの説明
Gitオブジェクトを共有するには、以下のオプションを指定します。ロングオプション | ショートオプション |
---|---|
--shared | -s |
「Gitオブジェクト」の参照先のリポジトリーを追加指定することも可能です。
「Gitオブジェクトを参照するリポジトリーを指定して、リモートリポジトリーをクローンする」を参考にしてください。
リモートリポジトリーのクローン例
「Gitオブジェクト」を共有して、「リモートリポジトリー」をクローンする例です。1.ローカルリポジトリーの配置場所とリモートリポジトリー
ここでは例として、「~/ドキュメント/git」フォルダー内に「myCloneProject」フォルダーを作成してもらい、「myCloneProject」フォルダー内にリポジトリーをクローンします。クローン元の「リモートリポジトリー」は、「~/ドキュメント/git/mySharedProject」です。
2.カレントディレクトリーの移動
「端末」を起動し、カレントディレクトリーを「~/ドキュメント/git」に移動します。3.コマンドの実行
「リモートリポジトリー」をクローンします。コマンドの説明は、「リモートリポジトリーをクローンするコマンドの説明」を参考にしてください。
ここでは、以下のコマンドを実行します。
ポイントは、赤字の箇所です。
git clone --shared mySharedProject myCloneProject
4.コマンドの実行結果
以下のように、「リモートリポジトリー」がクローンされます。5.フォルダーの確認
「Nautilus」を起動し「~/ドキュメント/git」フォルダーを見ると、以下のように「myCloneProject」フォルダーが作成されています。6.myCloneProjectフォルダーの確認
「myCloneProject」フォルダーを開くと、クローンされたリポジトリーが配置されています。「.git」フォルダーが、「Gitディレクトリー」です。
「myCloneProject」フォルダーが、「ワーキングディレクトリー」です。
「test.txt」はチェックアウトされたプロジェクトのファイルです。
Gitオブジェクトの確認
「Gitオブジェクト」が配置されるフォルダーを確認してみます。1.リモートリポジトリーのGitオブジェクト
「リモートリポジトリー」の 「/objects」フォルダーを見ると、以下のように「Gitオブジェクト」が配置されています。「a3」や「a5」など、フォルダー名が2文字のフォルダー内に、様々な「Gitオブジェクト」が配置されています。
2.ローカルリポジトリーのGitオブジェクト
「ローカルリポジトリー」の 「.git/objects」フォルダーを見ると、以下のように「Gitオブジェクト」が配置されていません。3.参照先が記述されたファイル
「ローカルリポジトリー」に「Gitオブジェクト」を配置する代わりに、「.git/objects/info/alternates」ファイルに、「Gitオブジェクト」の参照先情報が記述されています。4.参照先の内容
「テキストエディター」で「alternates」ファイルを開くと、以下のように「Gitオブジェクト」の参照先が記述されています。「ローカルリポジトリー」でクローン時の「Gitオブジェクト」が必要なった時は、この参照先から「Gitオブジェクト」を取得します。
この参照先は、「リモートリポジトリー」の「オブジェクトデータベース」を指していsます。
5.ローカルリポジトリーでコミットを行うと
「ローカルリポジトリー」でコミットを行うと、「Gitオブジェクト」は「ローカルリポジトリー」に配置されます。「b3」や「ba」など、フォルダー名が2文字のフォルダー内に、コミット時の「Gitオブジェクト」が配置されています。
このように、「リモートリポジトリー」の「Gitオブジェクト」を参照するのは、クローン時に「リモートリポジトリー」にあった「Gitオブジェクト」です。