132

使い方がとてもわかりませんgit archive

トップレベルにFooBarBazフォルダーがあるgitリポジトリがあります 。迅速なテスト展開のために、フォルダーFooをSVN風の方法でエクスポートする必要があります。

git-archive私は、SVN風のエクスポートのような方法で使用できることを学びました。

しかし、これが問題です。以下は正常に機能します。

git archive master | tar -x -C ~/destination

その結果、宛先フォルダーにFooBarBazフォルダーが作成されます。

ただし、次のエラーは次のようになりますfatal not a valid object name

git archive master/foo | tar -x -C ~/destination

ドキュメント

git archiveプログラムの概要を見ると<tree-ish> [path]、パラメーターとしてaをとることができることがわかります(関連する部分に要約された概要)。

git archive <tree-ish> [path...]

そう master/foo でない場合 tree-ish、それでは何ですか?

4

6 に答える 6

191

ショートアンサー(TL; DR)

「Tree-ish」は、最終的に(サブ)ディレクトリツリーにつながる識別子( Gitリビジョンのドキュメントで指定されている)を指す用語です(Gitはディレクトリを「ツリー」および「ツリーオブジェクト」と呼びます)。

元の投稿者の場合、foo 彼が指定したいディレクトリです。Gitで(サブ)ディレクトリを指定する正しい方法は、次の「ツリーっぽい」構文を使用することです(Gitリビジョンドキュメントの項目#15 )。

<rev>:<path>、例えばHEAD:README、、:READMEmaster:./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は、すべてコミットにつながるため、すべて「コミットっぽい」ですが、コミットはディレクトリツリーも指すため、最終的にはすべて(サブ)ディレクトリツリーオブジェクトになり、「ツリー」としても使用できます。 -Hは"。

#15は、(サブ)ディレクトリを参照するときにツリー風として使用することもできますが、特定のファイルを識別するためにも使用できます。それがファイルを参照するとき、それがまだ「ツリーっぽい」と見なされるのか、それとも「ブロブっぽい」のように機能するのかはわかりません(Gitはファイルを「ブロブ」と呼びます)。

長い答え

最も低いレベルでは、Gitは4つの基本的なオブジェクトを使用してソースコードを追跡します。

  1. コミットを指す注釈付きタグ。
  2. プロジェクトのルートディレクトリツリーを指すコミット。
  3. ディレクトリとサブディレクトリであるツリー。
  4. ファイルであるブロブ。

Linus TorvaldsはGitをコンテンツアドレス可能なファイルシステムのように設計したため、これらの各オブジェクトには独自のsha1ハッシュIDがあります。つまり、ファイルはコンテンツに基づいて取得できます(sha1 IDはファイルコンテンツから生成されます)。Pro Gitの本は、この例の図を示しています。

ProGitブックの図9-3

多くのGitコマンドは、コミットおよび(サブ)ディレクトリツリーの特別な識別子を受け入れることができます。

  • 「Commit-ish」は、最終的にコミットオブジェクトにつながる識別子です。例えば、

    tag -> commit

  • 「Tree-ish」は、最終的にツリー(つまりディレクトリ)オブジェクトにつながる識別子です。

    tag -> commit -> project-root-directory

コミットオブジェクトは常にディレクトリツリーオブジェクト(プロジェクトのルートディレクトリ)を指すため、「コミットっぽい」識別子は、定義上、「ツリーっぽい」でもあります。つまり、コミットオブジェクトにつながる識別子は、(サブ)ディレクトリツリーオブジェクトにつながるためにも使用できます

ただし、Gitのバージョン管理システムではディレクトリツリーオブジェクトがコミットを指すことはないため、(サブ)ディレクトリツリーを指すすべての識別子を使用してコミットを指すこともできるわけではありません。言い換えると、「コミットっぽい」識別子のセットは、「ツリーっぽい」識別子のセットの厳密なサブセットです。

ドキュメントで説明されているように(私がそれを見つけるのを手伝ってくれたTreborに感謝します):

<tree>

ツリーオブジェクト名を示します。

<commit>

コミットオブジェクト名を示します。

<tree-ish>

ツリー、コミット、またはタグオブジェクト名を示します。引数を取るコマンドは、<tree-ish> 最終的にはオブジェクトを操作したいのですが、を指すオブジェクトを<tree>自動的に逆参照<commit>します。<tag><tree>

<commit-ish>

コミットまたはタグオブジェクト名を示します。引数を取るコマンドは、<commit-ish> 最終的にはオブジェクトを操作したいのですが、を指すオブジェクトを<commit>自動的に逆参照します。<tag><commit>

commit-ishとして使用できないtree-ish識別子のセットは

  1. <rev>:<path>、オブジェクトをコミットするのではなく、ディレクトリツリーに直接つながります。たとえば、HEAD:subdirectory

  2. ディレクトリツリーオブジェクトのSha1識別子。

于 2013-09-04T04:38:08.300 に答える
55

ツリーっぽいのは、次のいずれかになり得る特定のツリーに名前を付ける方法です。

  • 次のような参照:
    • タグ
    • 支店名
    • のようなリモコン付きのブランチ名origin/somebranch
  • ハッシュ
  • 短いハッシュ

^その上、上記のいずれにも、を追加できます~。参照では@{}、いくつかの追加機能の表記を使用することもできます。

  • HEAD^またはHEAD^1、HEADの最初の親に解決されます。
  • HEAD^22番目の親に解決されます
  • HEAD^33番目の親に解決されます。これはよりまれ で、タコ戦略とのマージの結果です。
  • HEAD~またはHEAD~1頭の最初の親に解決されます
  • HEAD~2HEADの最初の親の最初の親に解決されます。これはと同じになりますHEAD^^
  • HEAD@{0}現在のHEADに解決されます
  • HEAD@{1}前の頭に解決されます。これは参照ログを使用するため、参照でのみ使用できます。HEADすべてのコミット、マージ、チェックアウトの場合、HEADの値が変更され、ログに追加されます。git reflog HEADHEADのすべての動きを確認できる参照ログが表示され、適切に何@{1}が解決されるかなどが表示されます。

上記のほとんどは、リポジトリで意味がある限り、さらに組み合わせることができます(例:HEAD@{2}~3、、、、somebranch^2~4)。c00e66e~4^2anotherbranch~^~^~^

したがって、上記のいずれかとその組み合わせは、ドキュメントでツリーっぽいものとして意味されているものです。これは、ほとんどのgitコマンドに使用する必要があるツリー(またはリビジョン)を示すための方法にすぎません。

Gitブックのリビジョン選択の詳細。

于 2012-12-06T22:54:14.373 に答える
11

あなたはおそらくしたい

git archive master foo | tar -x -C ~/destination

この式master/fooは意味がありません。私が推測するように、はmasterブランチ名でfooあり、ディレクトリ名です。

編集:(壊れたリンクを削除しました。コメントを参照してください。)

于 2010-10-28T15:32:50.477 に答える
7

の定義については、git(1)のマニュアルページ<tree-ish>を参照してください。用語を検索する必要があります。一般に、gitツリーオブジェクトへの参照を意味しますが、ツリーを参照するオブジェクトのタイプ(コミットやブランチなど)を渡すと、gitは自動的に参照されたツリーを使用します。<commit-ish><tree-ish>

于 2013-04-16T16:22:53.697 に答える
1

Git用語集からtree-ishは、「ツリーオブジェクトまたはツリーオブジェクトに再帰的に逆参照できるオブジェクト」です。commit、HEAD、およびtagは、ツリー風のオブジェクトの例です。

于 2019-08-26T22:52:08.607 に答える
0

私はソース管理とgitの初心者です。これは私が知っていることです。ツリーは、リポジトリ内のファイルの構造です。これはファイルシステムのディレクトリに似ています。参照- このツリービューを生成したgitツールはどれですか?

ツリーっぽいというのは木のような意味です。ツリーの一部またはコミットを参照します。コミットのSHA-1ハッシュの全部または一部、HEADポインター、ブランチ参照、タグ参照のいずれかを使用して、コミットを参照できます。別の方法では、コミットの祖先または親とともに、前述の方法のいずれかを使用します。祖先の例: ここに画像の説明を入力してください

于 2015-11-13T19:26:59.710 に答える