短い答え(TL; DR)
「ツリーっぽい」とは、最終的に(サブ)ディレクトリツリー(Gitがディレクトリを「ツリー」および「ツリーオブジェクト」と呼ぶ)につながる(Gitリビジョンのドキュメントで指定されている)任意の識別子を指す用語です。
元の投稿者の場合foo
は、彼が指定したいディレクトリです。Gitで(サブ)ディレクトリを指定する正しい方法は、次の「ツリーっぽい」構文を使用することです(Gitリビジョンドキュメントのアイテム#15 ):
<rev>:<path>
例えばHEAD:README
、:README
、master:./README
接尾辞と:
それに続くパスは、コロンの前の部分で指定されたツリーっぽいオブジェクトの特定のパスにあるblobまたはツリーを指定します。
つまり、言い換えれば、master:foo
は正しい構文であり、ではありませんmaster/foo
。
その他の「ツリーっぽい」(プラスコミットっぽい)
コミットっぽい、ツリーっぽい識別子の完全なリストは次のとおりです(Gitリビジョンのドキュメントから、指摘してくれたLopSaeに感謝します)。
----------------------------------------------------------------------
| Commit-ish/Tree-ish | Examples
----------------------------------------------------------------------
| 1. <sha1> | dae86e1950b1277e545cee180551750029cfe735
| 2. <describeOutput> | v1.7.4.2-679-g3bee7fb
| 3. <refname> | master, heads/master, refs/heads/master
| 4. <refname>@{<date>} | master@{yesterday}, HEAD@{5 minutes ago}
| 5. <refname>@{<n>} | master@{1}
| 6. @{<n>} | @{1}
| 7. @{-<n>} | @{-1}
| 8. <refname>@{upstream} | master@{upstream}, @{u}
| 9. <rev>^ | HEAD^, v1.5.1^0
| 10. <rev>~<n> | master~3
| 11. <rev>^{<type>} | v0.99.8^{commit}
| 12. <rev>^{} | v0.99.8^{}
| 13. <rev>^{/<text>} | HEAD^{/fix nasty bug}
| 14. :/<text> | :/fix nasty bug
----------------------------------------------------------------------
| Tree-ish only | Examples
----------------------------------------------------------------------
| 15. <rev>:<path> | HEAD:README, :README, master:./README
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
識別子#1-14はすべて「コミットっぽい」です。これらはすべてコミットにつながるためですが、コミットもディレクトリツリーを指すため、最終的にはすべて(サブ)ディレクトリツリーオブジェクトにつながり、したがって「ツリー」としても使用できます。 -Hは"。
#15は、(サブ)ディレクトリを参照するときにツリーのように使用することもできますが、特定のファイルを識別するために使用することもできます。それがファイルを参照するとき、それがまだ「ツリーっぽい」と見なされているのか、それとも「ブロブっぽい」(Gitがファイルを「ブロブ」と呼ぶ)のように振る舞うのかはわかりません。
長い答え
最低レベルでは、Gitは4つの基本オブジェクトを使用してソースコードを追跡します。
- コミットを指す注釈付きタグ。
- プロジェクトのルートディレクトリツリーを指すコミット。
- ツリーは、ディレクトリとサブディレクトリです。
- ファイルであるブロブ。
Linus TorvaldsはGitをコンテンツアドレス可能なファイルシステムのように設計したため、これらのオブジェクトにはそれぞれ独自のsha1ハッシュIDがあります。つまり、ファイルはコンテンツに基づいて取得できます(sha1 IDはファイルコンテンツから生成されます)。Pro Gitブックには、次の図の例が示されています。
多くのGitコマンドは、コミットおよび(サブ)ディレクトリツリーの特別な識別子を受け入れることができます。
「コミットっぽい」は、最終的にコミットオブジェクトにつながる識別子です。例えば、
tag -> commit
「ツリーっぽい」は、最終的にツリー(ディレクトリ)オブジェクトにつながる識別子です。
tag -> commit -> project-root-directory
commitオブジェクトは常にディレクトリツリーオブジェクト(プロジェクトのルートディレクトリ)を指すため、「commit-ish」である識別子はすべて、定義上は「tree-ish」でもあります。言い換えると、コミットオブジェクトにつながる識別子は、(サブ)ディレクトリツリーオブジェクトにつながるためにも使用できます。
ただし、Gitのバージョン管理システムではディレクトリツリーオブジェクトがコミットをポイントすることはないため、(サブ)ディレクトリツリーをポイントするすべての識別子を使用してコミットをポイントできるわけではありません。言い換えると、「commit-ish」識別子のセットは、「tree-ish」識別子のセットの厳密なサブセットです。
ドキュメントで説明したように(Treborが見つけてくれてありがとう):
<tree>
ツリーオブジェクト名を示します。
<commit>
コミットオブジェクト名を示します。
<tree-ish>
ツリー、コミット、またはタグのオブジェクト名を示します。<tree-ish>
引数を取るコマンドは、最終的に<tree>
オブジェクトを操作したいが、を指すオブジェクト<commit>
と<tag>
オブジェクトを自動的に逆参照します<tree>
。
<commit-ish>
コミットまたはタグのオブジェクト名を示します。<commit-ish>
引数を取るコマンドは、最終的に<commit>
オブジェクトを操作したいが、<tag>
を指すオブジェクトを自動的に逆参照します<commit>
。
commit-ishとして使用できないツリーっぽい識別子のセットは、
<rev>:<path>
オブジェクトをコミットするのではなく、ディレクトリツリーに直接つながります。たとえば、HEAD:subdirectory
。
ディレクトリツリーオブジェクトのSha1識別子。
master:foo
木っぽいですがmaster foo
、iとして使用する方がよいでしょう<tree-ish> <path>
。