web-dev-qa-db-ja.com

ベアリポジトリとは何ですか?なぜ必要なのですか?

これはおそらく答えられましたが、私は良い答えを見つけられませんでした。
私はSVNなどの集中型リポジトリから来ています。通常、チェックアウト、更新、コミット、復帰、マージのみを実行し、それ以上は実行しません。

Gitは私を夢中にさせています。コマンドはたくさんありますが、理解するのが最も難しいのは、多くのことが同じように機能する理由です。

"ベアgitリポジトリとは何ですか?"

git init --bareで作成されたリポジトリは、ベアリポジトリと呼ばれます。それらは、作業ディレクトリとは少し異なる構造になっています。まず、ソースファイルの作業用またはチェックアウト済みのコピーが含まれていません。

git init --bareで作成されたベアリポジトリは…共有用です。 …開発者は、共有ベアリポジトリのクローンを作成し、リポジトリの作業コピーをローカルで変更してから、共有ベアリポジトリにプッシュバックして、変更を他のユーザーが利用できるようにします。
– Jon Saints、 http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/

ただし、受け入れられた回答から "githubリポジトリとgitベアリポジトリの違いは何ですか?"

プッシュ先のリモートリポジトリ[sic]と同様に、GitHubのGitリポジトリはベアです。
– VonC、 https://stackoverflow.com/a/20855207

ただし、GitHubにはソースファイルがあります。私はそれらを見ることができます。ベアリポジトリを作成すると、ソースファイルはなく、作業リポジトリの.gitディレクトリの内容のみが表示されます。

これはどのように可能ですか?何がわからないの?

ベアリポジトリが必要な理由と、そのように機能する動機について例を挙げていただけますか?

更新

エドワード・トムソンの答えは、部分的には、私が知りたかったことです。それにもかかわらず、私は私の質問を言い換えます:

私が投稿した最初のリンクstates( "裸のgitリポジトリとは何ですか?" ):

それら[ベアリポジトリ]には、ソースファイルの作業コピーまたはチェックアウトコピーが含まれていません。

VonCの答え:

GitHubのGitリポジトリはむき出しです

両方のステートメントは、

Githubには作業用コピーがありません。

エドワードトムソンは言う:

データをナビゲートすると、データに基づいてWebページがレンダリングされます。最初にファイルサーバー上のディスクに書き込むのではなく、データをリポジトリから直接プルしてWebブラウザに出力します。

どういうわけか、裸のリポジトリにはすべてのデータとソースコードが含まれている必要があります。そうでなければ、すべてのソースコードが更新(コミット)され、すべてのブランチ(それぞれのソースを含む)、リポジトリのログ全体などが表示されるため、何もレンダリングすることは不可能ではありません。

リポジトリのデータ全体が常に.gitディレクトリ内(またはベアリポジトリ内)にあり、いつでもすべてのファイルをレンダリングできる何らかの形式でありますか?これがベアリポジトリの理由ですか?作業コピーには特定の時間のファイルしかありませんか?

16
Albert

リポジトリのデータ全体が常に.gitディレクトリ内(またはベアリポジトリ内)にあり、いつでもすべてのファイルをレンダリングできる何らかの形式でありますか?

はい、これらのファイルとその完全な履歴は .git/packed-refs.git/refs 、および 。git/objects に保存されます。

リポジトリのクローンを作成する場合(裸かどうか)、常に.gitフォルダー(または裸のリポジトリの場合は.git拡張子の付いたフォルダー)があります。命名規則)とそのGit管理ファイルおよび制御ファイル。 ( 用語集を参照

Gitは git unpack-objectsで必要なものをいつでも解凍できます

秘訣は次のとおりです。

ベアリポジトリから、ログをクエリできます(gitbareリポジトリのgit logは問題なく動作します:作業ツリーは必要ありません)、または ベアリポジトリ内のファイルを一覧表示します
または 裸のリポジトリからのファイルの内容を表示する
これが、GitHubがfullリポジトリをチェックアウトすることなくファイルを含むページをレンダリングする方法です。

GitHubが正確にそれを実行していることはわかりませんが、リポジトリの数が非常に多いため、 GitHubエンジニアリングチーム あらゆる種類の最適化を実行します。
たとえば、 レポのクローン作成/フェッチをどのように最適化したか を参照してください。
DGitを使用すると、これらのベアリポジトリは実際には複数のサーバーに複製されます。

これがベアリポジトリの理由ですか?作業コピーには特定の時間のファイルしかありませんか?

GitHubの場合、作業ツリーを維持するには、ディスクスペースと更新(各ユーザーが異なるブランチを要求する場合)にコストがかかりすぎます。一意のベアリポジトリから、ページをレンダリングするために必要なものを抽出するのが最善です。

一般に(GitHub制約の外で)、 プッシュされたばかりのものと同期していない作業ツリー になるのを避けるために、プッシュにはベアリポジトリが使用されます。具体的な例については、「 しかし、なぜベアリポジトリが必要なのですか? "」を参照してください。

言われていること:

ただし、GitHubでは、保存する必要のあるリポジトリごとに1つ(またはサーバー)の作業ツリーを維持できないため、これは不可能です。

8
VonC