Tree-ish trong Git có nghĩa là gì?


122

Tôi rất bối rối về cách sử dụng git archive.

Tôi có một kho lưu trữ git với thư mục Foo , BarBaz ở cấp cao nhất. Tôi cần xuất thư mục Foo theo kiểu SVN-ish để triển khai thử nghiệm nhanh chóng.

Tôi học được rằng tôi có thể sử dụng git-archivetheo cách xuất SVN-ish .

Nhưng đây là điều, Những điều sau đây hoạt động tốt:

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

nó dẫn đến các thư mục Foo , Bar , Baz trong thư mục đích .

Tuy nhiên, những điều sau sẽ xảy ra với fatal not a valid object name:

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

Tài liệu

Nhìn vào phần tóm tắt git archivechương trình, tôi thấy rằng nó có thể lấy <tree-ish> [path]một tham số (tóm tắt tóm tắt cho các phần có liên quan):

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

Nếu master/foo không tree-ish, thì là gì?


2
master:foolà tree-ish, nhưng tốt hơn bạn nên sử dụng master foonhư tôi <tree-ish> <path>.
Jakub Narębski

1
Tôi đã hiểu <tree-ish> là và tính từ của [path]. Đó là nơi tôi đã sai. Và tất cả các ví dụ tôi thấy chỉ sử dụng phần <tree-ish> của lệnh, vì vậy tôi đã nhầm tưởng rằng chúng đang sử dụng đường dẫn '<tree-ish>. Oh ngữ nghĩa :)
dkinzer


3
Tôi có vấn đề với câu hỏi này vì tiêu đề hỏi về tree-ish trong git nhưng sau đó nó bắt đầu và dường như chủ yếu là về một số lệnh. Hơn nữa, câu trả lời được chấp nhận dường như không giải quyết chính xác ý nghĩa của thuật ngữ tree-ish. Tiêu đề của câu hỏi phải thay đổi hoặc câu hỏi phải thay đổi. Tôi đề nghị rằng tiêu đề nên được điều chỉnh tốt hơn cho phù hợp với câu hỏi thực sự là gì và câu trả lời được chấp nhận là gì. Hoặc có thể thay đổi câu trả lời được chấp nhận thành tiêu đề câu hỏi thực sự là gì. Hoặc câu trả lời nên giải quyết tiêu đề câu hỏi.
Charlie Parker

@CharlieParker rõ ràng là các trang man cho git archivelệnh không còn đề cập đến tree-ish nữa, nhưng khi tôi hỏi câu hỏi này thì họ đã làm. Và liên quan đến câu trả lời được chấp nhận; vào thời điểm đó không ai khác bận tâm trả lời câu hỏi. Hơn hai năm sau, một câu trả lời khác thậm chí đã được đăng.
dkinzer

Câu trả lời:


167

Câu trả lời ngắn (TL; DR)

"Tree-ish" là một thuật ngữ đề cập đến bất kỳ số nhận dạng nào (như được chỉ định trong tài liệu sửa đổi Git ) cuối cùng dẫn đến một cây thư mục (con) (Git đề cập đến các thư mục là "cây" và "đối tượng cây").

Trong trường hợp của người đăng ban đầu, foo là một thư mục mà anh ta muốn chỉ định. Cách chính xác để chỉ định thư mục (con) trong Git là sử dụng cú pháp "tree-ish" (mục # 15 từ tài liệu sửa đổi Git ):

<rev>:<path>, Ví dụ như HEAD:README, :README,master:./README

Một hậu tố được :theo sau bởi một đường dẫn đặt tên cho đốm màu hoặc cây tại đường dẫn đã cho trong đối tượng tree-ish được đặt tên bởi phần trước dấu hai chấm.

Vì vậy, nói cách khác, master:foolà cú pháp chính xác, không phải master/foo.

"Tree-ish" khác (Plus Cam kết)

Dưới đây là danh sách đầy đủ các định danh cam kết và cây-ish (từ tài liệu sửa đổi Git , cảm ơn LopSae đã chỉ ra ):

----------------------------------------------------------------------
|    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
----------------------------------------------------------------------

Các mã định danh # 1-14 đều là "commit-ish", vì tất cả chúng đều dẫn đến các cam kết, nhưng vì các cam kết cũng trỏ đến cây thư mục, cuối cùng tất cả chúng đều dẫn đến các đối tượng cây thư mục (con) và do đó cũng có thể được sử dụng như "cây -nói ”.

# 15 cũng có thể được sử dụng dưới dạng tree-ish khi nó tham chiếu đến một thư mục (con), nhưng nó cũng có thể được sử dụng để xác định các tệp cụ thể. Khi nó đề cập đến các tệp, tôi không chắc liệu nó có còn được coi là "tree-ish" hay không, hay nó hoạt động giống "blob-ish" hơn (Git đề cập đến các tệp là "blobs").

Câu trả lời dài

Ở các cấp thấp nhất, Git theo dõi mã nguồn bằng bốn đối tượng cơ bản:

  1. Các thẻ được chú thích, trỏ đến các cam kết.
  2. Cam kết, trỏ đến cây thư mục gốc của dự án của bạn.
  3. Cây, là thư mục và thư mục con.
  4. Blobs, là các tập tin.

Mỗi đối tượng này đều có ID băm sha1 của riêng nó, vì Linus Torvalds đã thiết kế Git giống như một hệ thống tệp có địa chỉ nội dung , tức là các tệp có thể được truy xuất dựa trên nội dung của chúng (ID sha1 được tạo từ nội dung tệp). Sách Pro Git đưa ra sơ đồ ví dụ này :

Hình 9-3 từ sách Pro Git

Nhiều lệnh Git có thể chấp nhận các số nhận dạng đặc biệt cho các cam kết và cây thư mục (con):

  • "Commit-ish" là các định danh cuối cùng dẫn đến một đối tượng cam kết. Ví dụ,

    tag -> commit

  • "Tree-ish" là các định danh cuối cùng dẫn đến các đối tượng cây (tức là thư mục).

    tag -> commit -> project-root-directory

Bởi vì các đối tượng cam kết luôn trỏ đến một đối tượng cây thư mục (thư mục gốc của dự án của bạn), bất kỳ số nhận dạng nào là "commit-ish", theo định nghĩa, cũng là "tree-ish". Nói cách khác, bất kỳ mã định danh nào dẫn đến đối tượng cam kết cũng có thể được sử dụng để dẫn đến đối tượng cây thư mục (con) .

Nhưng vì các đối tượng cây thư mục không bao giờ trỏ đến các cam kết trong hệ thống lập phiên bản của Git, nên không phải mọi mã định danh trỏ đến một cây thư mục (con) cũng có thể được sử dụng để trỏ đến một cam kết. Nói cách khác, tập hợp các số nhận dạng "commit-ish" là một tập hợp con nghiêm ngặt của bộ số nhận dạng "tree-ish".

Như đã giải thích trong tài liệu ( cảm ơn Trebor đã giúp tôi tìm nó ):

<tree>

Cho biết tên đối tượng cây.

<commit>

Cho biết tên đối tượng cam kết.

<tree-ish>

Chỉ ra một cây, cam kết hoặc gắn thẻ tên đối tượng. Một lệnh nhận <tree-ish> đối số cuối cùng muốn hoạt động trên một <tree>đối tượng nhưng tự động bỏ tham chiếu <commit><tag>các đối tượng trỏ đến a <tree>.

<commit-ish>

Cho biết tên đối tượng cam kết hoặc thẻ. Một lệnh có <commit-ish> đối số cuối cùng muốn hoạt động trên một <commit>đối tượng nhưng tự động bỏ tham chiếu đến <tag>các đối tượng trỏ đến a <commit>.

Bộ định danh cây-ish không thể được sử dụng làm cam kết

  1. <rev>:<path>, dẫn trực tiếp đến cây thư mục, không phải đối tượng cam kết. Ví dụ HEAD:subdirectory,.

  2. Định danh Sha1 của các đối tượng cây thư mục .


Còn mục 16 trên bàn của bạn thì sao? Nó có nghĩa là bạn không chắc đó có phải là cây hay không? Số 0 đề cập đến trạng thái hợp nhất và khái niệm này chỉ áp dụng cho các đốm màu, vì chỉ mục thậm chí không chứa các thư mục. Xem: stackoverflow.com/a/25806452/895245 . Vì vậy, câu hỏi đặt ra sau đó là: có phải tất cả các đốm màu cũng là bụi cây? Theo như tôi có thể nói yes: tất cả các trang con người sử dụng <tree-ish>chấp nhận cả hai, và man gitrevisionsđịnh nghĩa: trees ("directories of files").
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Lưu ý rằng git-archivenó mất một <tree-ish>nhưng nó không cho phép a <sha1>. Vì vậy, tôi đoán nó nên thay vì yêu cầu một <tree-ish-ish>. stackoverflow.com/a/12073669/680464
juanitogan

Tuy nhiên tôi tự hỏi về những gì xảy ra khi tôi sử dụng <rev>: (không có bất kỳ đường dẫn ?. Nó hoạt động như cố gắng - nhưng tôi không thể tìm thấy phần có liên quan trong tài liệu.
Martin Vejmelka

49

Tree-ish là một cách đặt tên cho một loại cây cụ thể có thể là một trong những cách sau:

  • Các tài liệu tham khảo như:
    • CÁI ĐẦU
    • Thẻ
    • Tên chi nhánh
    • Tên chi nhánh có điều khiển từ xa, như origin/somebranch
  • Băm
  • Băm ngắn

Ngày đầu đó, bất kỳ ở trên có thể được nối với ^, ~. Tài liệu tham khảo cũng có thể sử dụng @{}ký hiệu cho một số tính năng bổ sung:

  • HEAD^hoặc HEAD^1sẽ được giải quyết cho phụ huynh đầu tiên của HEAD.
  • HEAD^2 sẽ giải quyết cho phụ huynh thứ hai
  • HEAD^3sẽ giải quyết cho cha mẹ thứ ba, v.v., hiếm hơn và là sản phẩm của sự hợp nhất với chiến lược bạch tuộc .
  • HEAD~hoặc HEAD~1sẽ giải quyết cho cha mẹ đầu tiên của người đứng đầu
  • HEAD~2sẽ giải quyết cho cha mẹ đầu tiên của cha mẹ đầu tiên của HEAD. Điều này sẽ giống nhưHEAD^^
  • HEAD@{0} sẽ giải quyết đến HEAD hiện tại
  • HEAD@{1}sẽ giải quyết cho người đứng đầu trước đó. Điều này chỉ có thể được sử dụng bởi các tham chiếu vì nó sử dụng nhật ký tham chiếu. Trong trường hợp HEADmỗi lần commit, merge, checkout sẽ thay đổi giá trị của HEAD và do đó thêm nó vào nhật ký. git reflog HEADsẽ hiển thị nhật ký tham chiếu nơi bạn có thể thấy tất cả các chuyển động của HEAD và những gì @{1}và như vậy sẽ giải quyết đúng cách.

Hầu hết những điều trên có thể kết hợp thêm chừng nào nó có ý nghĩa trong kho của bạn, ví dụ: HEAD@{2}~3, somebranch^2~4, c00e66e~4^2, anotherbranch~^~^~^.

Vì vậy, bất kỳ điều nào được mô tả ở trên và các kết hợp của nó, trong tài liệu có nghĩa là một tree-ish, đây chỉ là một cách để nói cây (hoặc bản sửa đổi) nào là cây nên được sử dụng cho hầu hết các lệnh git.

Thông tin thêm trong Lựa chọn sửa đổi trong sách Git .


1
Câu trả lời này giải thích các bản sửa đổi (commit-ishes) nói chung và bỏ sót trường hợp quan trọng:, master:path/to/directorylà một tree-ish nhưng không phải là một commit-ish. Cupcake's làm cho điều đó rõ ràng hơn.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

11

Bạn có thể muốn

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

Biểu thức master/fookhông có ý nghĩa: masterlà một tên nhánh và foolà một tên thư mục, như tôi đoán.

Chỉnh sửa : (Đã xóa liên kết bị hỏng. Xem nhận xét.)


Từ "cây" không còn được tìm thấy trên liên kết "Git Treeilities" của bạn. FYI
Robert

Treeish thường đề cập đến cây sửa đổi, không phải bố cục thư mục.
Jürgen Strobel

6
@ JürgenStrobel: Điều đó không đúng. Nó không đề cập đến cả hai - ở thì quá khứ, bởi vì thuật ngữ này không được sử dụng nữa trong phiên bản hiện tại của tài liệu. (Đó cũng là lý do tại sao liên kết bị hỏng.) Trước đây, một treeish đề cập đến một cái gì đó có thể được giải quyết thành một đối tượng cây trong kho đối tượng của git. Điều này bao hàm bất kỳ đặc tả cam kết nào, vì mỗi cam kết đề cập đến một đối tượng cây duy nhất. Đối tượng cây chứa thông tin về cây thư mục của cam kết này - hãy xem phần về các đối tượng git trong "Pro Git" để biết thêm chi tiết.
Sven Marnach

6

Để biết định nghĩa của <tree-ish><commit-ish>xem trang git (1) man. Bạn sẽ phải tìm kiếm các thuật ngữ. Nói chung <tree-ish>có nghĩa là một tham chiếu đến một đối tượng cây git, nhưng nếu bạn truyền một loại đối tượng tham chiếu đến một cây (chẳng hạn như cam kết hoặc nhánh), git sẽ tự động sử dụng cây được tham chiếu.


gitrevisions(7).
Xiong Chiamiov 13/09/13

0

Tôi là một người mới để kiểm soát nguồn và git. Đây là những gì tôi biết. Cây là cấu trúc của các tệp trong kho lưu trữ. Nó tương tự như một thư mục trong hệ thống tệp. Xem - Công cụ git nào tạo ra chế độ xem dạng cây này?

Tree-ish có nghĩa là giống như một cái cây. Nó tham chiếu đến một phần hoặc cam kết của cây. Bạn có thể tham chiếu một cam kết bằng cách sử dụng bất kỳ một trong số này: toàn bộ hoặc một phần hàm băm SHA-1 của một cam kết, con trỏ HEAD, tham chiếu nhánh, tham chiếu thẻ. Một phương pháp khác sử dụng bất kỳ phương thức nào được đề cập cùng với tổ tiên hoặc cha mẹ của một cam kết. Ví dụ về tổ tiên: nhập mô tả hình ảnh ở đây


0

Từ Git Thuật ngữ tree-ish là "Một đối tượng cây hoặc một đối tượng có thể được tham chiếu đệ quy đến một đối tượng cây." commit, HEAD và tag là các ví dụ về các đối tượng dạng cây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.