Gitリポジトリ内部形式の説明

彼のリポジトリにあるファイルをGitに保存する方法に関するドキュメントはありますか?私はインターネット上で検索しようとしていますが、利用可能な結果はありません。たぶん私は間違ったクエリを使用しているか、これは素晴らしい秘密かもしれません - Gitリポジトリの内部形式ですか?

なぜ私はこのロケット科学情報が必要なのかを説明しましょう:私はC#を使ってファイル履歴フォームリポジトリを取得しています。しかし、 libgit2sharp ライブラリでは、現在実装されていません。だから(責任者として)私は自分自身でこの機能を実装し、コミュニティに貢献する必要があります。

しかし、カーネルソースをgithubに移動した後でも、私の検索にどこから始めるのか分からない。

事前に多くの感謝!

13
ありがとうマリアン、お勧めですか?
追加された 著者 shytikov,
他のオープンソースのgit実装を掘り下げることができます
追加された 著者 Marian Theisen,
progit.org/book/ch9-2.html こちらから始めてください。
追加された 著者 Jacob Groundwater,

1 答え

リポジトリの内部形式は非常に簡単です。 Gitは、本質的には、アドレス指定可能なユーザスペースファイルシステムです。

ここにサムネイルスケッチがあります。

オブジェクト

Git stores its internal data structures as オブジェクト. There are four kinds of オブジェクト: blobs (sort of like files), trees (sort of like directories), commits (snapshots of the file system at particular points in time along with information on how to reach there) and tags (pointers to commits useful for marking important ones).

If you look inside the .git directory of a repository, you'll find an オブジェクト directory that contains files named by the SHA-1 hash. Each of them represents an object. You can inspect them using plumbing git cat-file command. An example commit object from one of my repositories

[email protected]% git cat-file -p 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
tree c45d8922787a3f801c0253b1644ef6933d79fd4a
parent 4ee56fbe52912d3b21b3577b4a82849045e9ff3f
author Noufal Ibrahim  1322165467 +0530
committer Noufal Ibrahim  1322165467 +0530

Added a .md extension to README

You can also see the the object itself at .git/オブジェクト/73/47addd901afc7d237a3e9c9512c9b0d05c6cf7.

You can examine other オブジェクト like this. Each commit points to a tree representing the file system at that point in time and has one (or more in case of merge commits) parent.

オブジェクト are stored as single files in the オブジェクト directory. These are called loose オブジェクト. When you run git gc, オブジェクト that can no longer be reached are pruned and the remaining are packed together into a a single file and delta compressed. This is more space efficient and compacts the repository. After you run gc, you can look at the .git/オブジェクト/pack/ directory to see git packfiles. To unpack them, you can use the plumbing command git unpack-オブジェクト command. The .git/オブジェクト/info/packs file contains a list of packfiles that are currently present.

参考文献

The next thing you need to know is what 参考文献 are. These are pointers to certain commits or オブジェクト. Your branches and other such things are implemented as 参考文献. There are two kinds "real" (which are like hard links in a file system) and "symbolic" (which are pointers to real 参考文献 - like symbolic links).

これらは .git/refs ディレクトリにあります。たとえば、上記のリポジトリでは、 master ブランチにあります。私の最近のコミットは

[email protected]% git log -1
commit 7347addd901afc7d237a3e9c9512c9b0d05c6cf7
Author: Noufal Ibrahim 
Date:   Fri Nov 25 01:41:07 2011 +0530

    Added a .md extension to README

.git/refs/heads/master にある私の master の参照がこのコミットを指していることがわかります。

[email protected]% more .git/refs/heads/master
7347addd901afc7d237a3e9c9512c9b0d05c6cf7

現在のブランチは、 .git/HEAD にあるシンボリックリファレンス HEAD に格納されます。ここにあります

[email protected]% more .git/HEAD
ref: refs/heads/master

ブランチを切り替えると変更されます。

Similarly, tags are 参考文献 like this too (but they are not movable unlike branches).

The entire repository is managed using just a DAG of commits (each of which points to a tree representing the files at a point in time) and 参考文献 that point to various commits on the DAG so that you can manipulate them.

参考文献

  • I have a presentation which I use for my git trainings up here that explains some of this.
  • The community book at http://book.git-scm.com/ has some sections on the internals.
  • Scott Chacon's Pro Git book has a section on internals
  • He also has a peepcode PDF just about the internals.
40
追加された
5つ目のタイプのオブジェクトもあります:ノートオブジェクト。参照: schacon.github.com/git/git-notes.html
追加された 著者 Tower,
これが主なアイデアですが、最終的には libgit2 に寄付して実際のプロジェクトにもう少し役立つ時間を与えました。それは、ファイル改訂履歴を表示できない本当に悪い冗談 - gitライブラリのようです。
追加された 著者 shytikov,
ありがとう! hm ...彼らは言う: Gitリポジトリとのやりとりのいくつかは、システムの git コマンドに砲撃することによって行われる。 git log コマンドも同様の方法ではありません...
追加された 著者 shytikov,
@ NoufalIbrahim、 grit が何か git log --follow の構文をサポートしていますか?
追加された 著者 shytikov,
追加された 著者 shytikov,
私は私の答えを更新しました。
追加された 著者 Noufal Ibrahim,
ありがとう。データベースを解析する1つの方法は、via git plumbing コマンドを使用することです。いくつかのサブプロセスインターフェイスと応答を解析します。配管はAPIなので、ライブラリはより堅牢になります(遅いですが)。私はルビーの宝石がこのように働くと信じています。もう1つの選択肢は、実際にC#関数を実装してデータベースを解析することです。これは、より多くの作業と保守が困難ですが、より高速でより「ネイティブ」になります。
追加された 著者 Noufal Ibrahim,
グリットをご覧ください。これはgitubの人が管理するgit用のRuby APIです。私はAPIが大好きです。
追加された 著者 Noufal Ibrahim,
よく分かりません。あなたはtreeishから始まるコミットのリストを得ることができ、おそらくあなたのアプリケーションにクロスリネームビットを実装します。
追加された 著者 Noufal Ibrahim,
@rファクター。面白い。ありがとう!
追加された 著者 Noufal Ibrahim,
@Tower:ノートはオブジェクトタイプではありません。それらは通常の履歴とまったく同じ方法で保存されます。
追加された 著者 grawity,
git gc を実行するとどうなるか説明できますか?オブジェクトは1つのファイルにまとめられていると私は理解しています。
追加された 著者 Jacob Groundwater,
非常に有益。 Alexeyがgitコマンドを起動せずに汎用データベースを手動で解析するのは難しいでしょう。
追加された 著者 Jacob Groundwater,