Gitリモートサーバーリポジトリのファイルストレージ

私はすぐにいくつかのiPhone/iPadアプリを開発し、Gitを私のバージョンコントロールシステムとして使用しようと考えています。過去のプロジェクト(iOSベースではない)ではSVNを使用しました。
Gitに切り替えるための私の主な決定は、非集中化された構造です。

私は中央サーバのGitリポジトリ(おそらくアトラシアンのビットバケット)としてリモートサーバを使用します。私はこれをまだ設定していませんが、その間はGitをローカルでテストしています。

私は多くの初心者の資料を読んできましたが、今は基本をかなりよく理解していますが、私が正しく理解することを確認するために必要なことが1つあります。

下の私の例では、Mac上でGitのローカルバージョンを使用しています。

git_test というローカルのgitリポジトリを作成しました。このリポジトリには、
file1file2
という2つのダミーファイルがあります。私はこれが私の実際のファイルを含む作業ディレクトリであることを理解しています(ブロブではありません)。

また、リモートサーバ上の中央リポジトリは、作業ディレクトリの実際のファイルが含まれていなくてはならないと理解しています。

同じローカルリポジトリを持つ2人のユーザー(ユーザーAとユーザーB)がいるとします。

ユーザーA

  • Modifies file1
  • Commits file1
  • Executes a push to the remote repository

ユーザーB

  • Modifies file2
  • Commits file2
  • Executes a push to the remote repository

新しいBLOBがリモートリポジトリの .git/objects
ディレクトリにアップロードされているということを訂正しますか?

次に、ユーザAとユーザBがローカルシステム上でプルコマンドを実行すると、ブロブではなく実際のファイルが新しいブロブの内容で更新されます。これは正しいです?

長らく残念な質問を申し訳ありません。私はすべてが意味をなさないと思う。

ベストアンサー

あなたは裸のリポジトリの中のブロブについてあまり心配する必要はありません。より理解しやすいことは、すべてのリポジトリが、そのリポジトリへのコミット時に正確なファイル構造を含むコミットオブジェクトで構成されていることです。

あなたの例では、ユーザAはローカルにcommitAを生成し、ユーザBはローカルにcommitBを生成します。両方ともコミットオブジェクト(たとえばcommitBase)を指していたはずの裸のリポジトリのマスターに基づいています。これは、どちらもcommitBaseの親を持っていることを意味します。

Aがプッシュすると、彼は自分のコミットAをベアリポジトリにプッシュし、マスターブランチポインタをコミットAに移動します。
file1に関するすべての情報は、コミットオブジェクトcommitA(ファイル構造の残りの情報に関する情報とともに)の内部にあります。

Bがプッシュする前に、リモートマスターブランチポインタがもはやcommitBaseを指していないため、最初にcommitAの変更をレポに取り込む必要があります。彼は、コミットオブジェクトと分岐ポインターでリモートと同期するまで押し込むことができません。したがって、commitAオブジェクトをリポジトリに入れると、fileAはその一部として取得されます。これは、プルまたはリベースを行うとファイルシステムに表示されますが、コミットオブジェクトはリポジトリにのみ取得されます(ファイルは含まれません)。彼の作業ディレクトリ)を取得する場合。フェッチでは、独自のマスターブランチポインタを変更せずに、gitを内部的に新しいコミットオブジェクトで更新します。マージ/リベースの時点では、一般的なファイルのマージが容易な場合や、新しいファイルを単にディスクに入れることができる場合や、大きすぎる場合など、作業ディレクトリのファイルに関するいくつかの決定を下す必要があります競合が発生し、ファイル内の競合を手動で解決する必要があります。

あなたの単純な例では、衝突がないので、commitAをcommitA2にして、commitBの親を持つか、またはマージしてcommitAオブジェクトの親をcommitBaseとして保持しますが、その結果である新しいcommitMオブジェクトを生成します。
BとAをマージする

どのようにgitがこれを3つのリポジトリの.git/objectsディレクトリで内部的に表しているかは、今のところ無関係です。好きなようにすべてのオブジェクトのデータベースを最大限に活用するために、圧縮したり移動したりしているかもしれませんが、ファイルに対するコミットオブジェクトの仕組みを理解しようとするときに心配していたことではありません。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です