[解決済み] Gitにおけるtree-ishの意味とは?
質問
をどのように使えばいいのか、とても困っています。
git archive
.
git リポジトリに、フォルダ Foo , バー と バズ をトップレベルにしています。 フォルダをエクスポートする必要があります。 Foo をSVN的な方法でエクスポートして、素早くテストデプロイできるようにしたいのです。
を使うことができることを知りました。
git-archive
の中に
SVN的なエクスポートのような方法で
.
しかし、ここからが本題です。 以下は問題なく動作します。
git archive master | tar -x -C ~/destination
であり、その結果 Foo , バー , バズ フォルダを 宛先 フォルダーに格納されます。
しかし、次のようにするとエラーになります。
と共に
fatal not a valid object name
:
git archive master/foo | tar -x -C ~/destination
ドキュメンテーション
のシノプシスを見ると
git archive
プログラムの概要を見ると、このプログラムは
<tree-ish> [path]
をパラメータとして受け取ることができます(あらすじを関連する部分に要約しています)。
git archive <tree-ish> [path...]
もし
master/foo
は
tree-ish
であるならば、何であるか?
どのように解決する?
簡単な答え (TL;DR)
"Tree-ish"は、任意の識別子(以下のように指定されたもの)を指す用語です。 Git のリビジョンに関する文書 で指定されている)、最終的に(サブ)ディレクトリにつながるあらゆる識別子を指します。 ツリー (Gitでは、ディレクトリのことを "ツリー" および "ツリーオブジェクト" と呼びます) に最終的につながります。
元の投稿者の場合
foo
はディレクトリ
を指定したい。
を指定します。Gitで(サブ)ディレクトリを指定する正しい方法は、次のようなものです。
ツリー的な構文 (項目番号15) です。
Git リビジョン ドキュメント
):
<rev>:<path>
は、例えばHEAD:README
,:README
,master:./README
接尾辞
:
の後にパスを指定すると、指定したパスにあるブロブまたはツリーを指定します。 コロンの前の部分によって名付けられたツリー状のオブジェクトを指定します。
つまり、言い換えれば
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はすべてコミットにつながるので、quot;commit-ish"です。 コミットはディレクトリツリーも指すので、最終的にこれらはすべて(サブ)ディレクトリツリーオブジェクトにつながります。 (サブ) ディレクトリ ツリー オブジェクトにつながるため、quot; tree-ish" として使用することもできます。
#15 は、(サブ) ディレクトリを参照するときにもツリーとして使用できますが、特定のファイルを識別するためにも使用できます。 は、特定のファイルを識別するために使用することもできます。ファイルを参照するとき、私は ファイルを参照するとき、それがまだ "tree-ish" と見なされるのか、それとももっと "blob-ish" のように振る舞うのか、よくわかりません(Git はファイルを "blob-ish" として参照します)。 はファイルを"blob"として参照します)。
長い答え
最も低いレベルでは、Gitは4つの基本的な オブジェクトを使用します。
- 注釈付きタグ。コミットを指します。
- プロジェクトのルートディレクトリツリーを指すコミット。
- ディレクトリとサブディレクトリであるツリー。
- ファイルであるブロブ。
Linus TorvaldsがGitのように設計したため、これらのオブジェクトはそれぞれ独自のsha1ハッシュIDを持っています。 のようにGitを設計しているからです。 コンテンツアドレス指定可能な ファイルシステムのように設計されています。 に基づいてファイルを取り出すことができます(sha1 IDはファイルの内容から生成されます)。The Pro Git の本では この例の図 :
多くの Git コマンドは、コミットや(サブ)ディレクトリツリーに対して特別な識別子を使用することができます。 ツリーに対して特別な識別子を使うことができます。
-
"Commit-ish"は、最終的にコミットオブジェクトにつながる識別子を指します。例えば
tag -> commit
-
"Tree-ish"は、最終的にツリー(すなわちディレクトリ)オブジェクトにつながる識別子です。
tag -> commit -> project-root-directory
コミットオブジェクトは常にディレクトリツリーオブジェクト(プロジェクトのルートディレクトリ)を指すので ディレクトリを指すので、quot;commit-ish" である任意の識別子は、定義上 である識別子は、定義上、"tree-ish" でもあります。言い換えれば につながる識別子はすべて コミットオブジェクトにつながる識別子は、(サブ)ディレクトリツリーオブジェクトにつながるために使用されることもできます。 .
しかし、Gitのバージョン管理システムでは、ディレクトリツリーオブジェクトがコミットを指すことはありません。 ではディレクトリツリー・オブジェクトはコミットを指すことはないので、(サブ)ディレクトリツリーを指すすべての識別子がコミットを指すために使えるわけではありません。 コミットを指すために使われるわけではありません。言い換えれば コミットっぽい識別子のセット は、"tree-ish" 識別子のセットの厳密なサブセットです。
で説明されているように ドキュメント ( を見つけるのを手伝ってくれたTreborに感謝します。 をありがとうございました。 ):
<tree>
ツリーオブジェクトの名称を示す。
<commit>
コミットオブジェクト名を示す。
<tree-ish>
ツリー、コミット、タグのオブジェクト名を示す。を取るコマンドは
<tree-ish>
引数を取るコマンドは、最終的に<tree>
オブジェクトを操作したいのに、自動的に を参照しません。<commit>
と<tag>
を指しているオブジェクトは<tree>
.<commit-ish>
コミットやタグのオブジェクト名を示す。を取るコマンドは
<commit-ish>
引数を取るコマンドは、最終的に<commit>
オブジェクトを操作したいのに、自動的に を参照しません。<tag>
オブジェクトを指す<commit>
.
ツリー状の識別子の集合で はコミット的なものとして使用できません。 は
-
<rev>:<path>
となり 直接 をコミットするのではなく、ディレクトリツリー オブジェクトではありません。例えばHEAD:subdirectory
. -
のSha1識別子。 ディレクトリツリー オブジェクトを作成します。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】Gitでコミットをチェリーピックするというのはどういう意味ですか?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GitHubのメッセージの意味: メールのプライバシー制限のためプッシュが拒否されました。
-
[解決済み】git-mergeの-dry-runオプションはありますか?
-
[解決済み] [Solved] 作業ツリーのディレクトリ 'example.com' を作成できませんでした。パーミッションが拒否されました
-
git revert + git rebase 一度に複数のコミット_本然233的博客程式员息信网_git revert Multiple
-
[解決済み] このリポジトリで別の git プロセスが実行されているようです。
-
[解決済み] fatal: bad revision "とはどういう意味ですか?
-
[解決済み] ssh-keygen' は内部コマンドまたは外部コマンドとして認識されません。
-
[解決済み] Git のコミットで変更点を確認するには?
-
[解決済み】gitのインデックスには何が含まれていますか?
-
[解決済み] Gitのcommit-ishとtree-ishとは何ですか?