git がコミット履歴を保存するファイルから読み取り、各コミット情報をプロジェクトの DB に保存し、すべての履歴をプロジェクト ビューに表示したい
2 に答える
コミット履歴を取得するために問い合わせることができる単一のファイルはありません。git のオブジェクト モデルについては、適切な説明がたくさんあります (たとえば、コンピューター サイエンティスト向けの git、Pro Git、git コミュニティ ブック)。
git にはさまざまな種類のオブジェクトがありますが、最も重要なのは次のとおりです。
- blob (ファイル) - バイナリ ファイルのみ
- ツリー(ディレクトリ) - ツリーは、他のオブジェクト (通常はブロブとツリー) のリストであり、それらの名前、ハッシュ、および制限付きの権限セットが含まれています。
- コミット(バージョン) - 各コミットには、その親コミットのハッシュ、作成者、コミット メッセージ、およびその他のメタデータが含まれます
これらはそれぞれ、その内容のハッシュによって識別され、このハッシュはオブジェクト名として知られています。これらは、おそらく git を使用する過程で見たことのある 40 桁の 16 進文字列です。各オブジェクトは.git/objects/
、ルーズ オブジェクト (ファイルごとに 1 つ) またはパック ファイルに効率的に格納された多くのオブジェクトの 1 つとして、ディレクトリに格納されます。このファイル.git/HEAD
は、リポジトリの現在のバージョンを表し、通常、特定のブランチへの参照が含まれています。これは、下のファイル.git/refs/heads
またはパック ファイルに保存されている参照によって表されます。(HEAD
特定のコミットのオブジェクト名を直接指す場合もあります。) などのブランチを表すこれらのファイルの 1 つには.git/refs/heads/master
、オブジェクト名だけが含まれています。
このブランチ ヒントから履歴をさかのぼるために、git はオブジェクト データベース内のそのファイルで名前が付けられたオブジェクトを見つけ、その親へのポインターを再帰的にたどります。
ただし、説明したユースケース(つまり、履歴をトラバースしてエクスポートする)については、次のいずれかを行うことを強くお勧めします。
- git コマンドを呼び出して履歴を見つけます。いわゆる「配管」コマンドの使用に固執する場合、それらの出力は git バージョン間で安定しているはずです。
- libgit2ライブラリを使用してリポジトリに問い合わせます。libgit2 は、git リポジトリを照会するための完全に再入可能なライブラリであり、現在、多くの言語のバインディングがあります。
git がオブジェクトを保存する方法については、こちらを参照してください: How git stored objects。その本の「内部と配管」セクションの他の章を読んで、すべてがどのように機能するかを理解してください。
本質的に「コミット履歴を保存するファイル」はなく、それよりも複雑です。選択した言語に対応する既存の API のいずれかを使用する必要があります (「git API」と使用する言語を検索してください。たくさんあります)。