Apa arti pohon-ish di Git?


122

Saya sangat bingung bagaimana cara menggunakannya git archive.

Saya memiliki repositori git dengan folder Foo , Bar , dan Baz di tingkat atas. Saya perlu mengekspor folder Foo dengan cara SVN-ish untuk penerapan uji cepat.

Saya belajar bahwa saya dapat menggunakan git-archivecara ekspor SVN-ish .

Tapi ini masalahnya, berikut ini berfungsi dengan baik:

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

itu menghasilkan folder Foo , Bar , Baz di folder tujuan .

Namun, hal berikut akan salah dengan fatal not a valid object name:

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

Dokumentasi

Melihat sinopsis git archiveprogram yang saya lihat dapat dijadikan <tree-ish> [path]sebagai parameter (sinopsis diringkas ke bagian-bagian yang relevan):

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

Jika master/foo tidak tree-ish, lalu apa?


2
master:fooadalah pohon-ish, tetapi Anda lebih baik menggunakan master foosebagai i <tree-ish> <path>.
Jakub Narębski

1
Saya telah menafsirkan <tree-ish> sebagai dan kata sifat dari [path]. Di situlah saya salah. Dan semua contoh yang saya lihat hanya menggunakan bagian perintah <tree-ish>, jadi saya salah berasumsi bahwa mereka menggunakan path '<tree-ish>. Oh semantik :)
dkinzer


3
Saya punya masalah dengan pertanyaan ini karena judulnya menanyakan tentang apa itu tree-ish di git tetapi kemudian dimulai dan tampaknya terutama tentang beberapa perintah. Lebih jauh lagi, jawaban yang diterima tampaknya tidak membahas apa sebenarnya arti istilah pohon. Judul pertanyaan harus diubah atau pertanyaan harus diubah. Saya menyarankan agar judul lebih baik disesuaikan dengan pertanyaan sebenarnya tentang apa dan apa jawaban yang diterima. Atau mungkin mengubah jawaban yang diterima menjadi apa judul pertanyaan sebenarnya. Atau jawabannya harus mengacu pada judul pertanyaan.
Charlie Parker

@CharlieParker rupanya halaman manual untuk git archiveperintah tidak lagi merujuk ke pohon-ish, tetapi ketika saya mengajukan pertanyaan ini mereka melakukannya. Dan tentang jawaban yang diterima; pada saat itu tidak ada orang lain yang mau menjawab pertanyaan itu. Lebih dari dua tahun kemudian, jawaban lain bahkan diposting.
dkinzer

Jawaban:


167

Jawaban Singkat (TL; DR)

"Tree-ish" adalah istilah yang merujuk pada pengenal apa pun (sebagaimana ditentukan dalam dokumentasi revisi Git ) yang pada akhirnya mengarah ke pohon direktori (sub) (Git merujuk ke direktori sebagai "pohon" dan "objek pohon").

Dalam kasus poster asli, foo adalah direktori yang ingin dia tentukan. Cara yang benar untuk menentukan sebuah (sub) direktori di Git adalah dengan menggunakan sintaks "tree-ish" ini (item # 15 dari dokumentasi revisi Git ):

<rev>:<path>, Misalnya HEAD:README, :README,master:./README

Sufiks yang :diikuti dengan jalur menamai blob atau pohon di jalur tertentu dalam objek pohon yang dinamai dengan bagian sebelum titik dua.

Jadi, dengan kata lain, master:foosintaks yang benar, bukan master/foo.

"Tree-ish" lainnya (Plus Commit-ish)

Berikut daftar lengkap pengenal commit-ish dan tree-ish (dari dokumentasi revisi Git , terima kasih kepada LopSae karena telah menunjukkannya ):

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

Pengidentifikasi # 1-14 semuanya "commit-ish", karena semuanya mengarah ke komit, tetapi karena komit juga menunjuk ke pohon direktori, mereka semua pada akhirnya mengarah ke (sub) objek pohon direktori, dan oleh karena itu juga dapat digunakan sebagai "pohon -ish ".

# 15 juga dapat digunakan sebagai pohon-ish ketika merujuk ke direktori (sub), tetapi juga dapat digunakan untuk mengidentifikasi file tertentu. Ketika merujuk ke file, saya tidak yakin apakah itu masih dianggap "tree-ish", atau apakah bertindak lebih seperti "blob-ish" (Git menyebut file sebagai "blob").

Jawaban Panjang

Pada level terendahnya, Git melacak kode sumber menggunakan empat objek fundamental:

  1. Tag beranotasi, yang mengarah ke komit.
  2. Komit, yang mengarah ke pohon direktori root proyek Anda.
  3. Pohon, yaitu direktori dan subdirektori.
  4. Blob, yang merupakan file.

Masing-masing objek ini memiliki ID hash sha1 sendiri, karena Linus Torvalds merancang Git seperti sistem file beralamat konten , yaitu file dapat diambil berdasarkan isinya (ID sha1 dihasilkan dari konten file). Buku Pro Git memberikan diagram contoh ini :

Gambar 9-3 dari buku Pro Git

Banyak perintah Git dapat menerima pengenal khusus untuk komit dan (sub) pohon direktori:

  • "Commit-ish" adalah pengidentifikasi yang pada akhirnya mengarah ke objek komit. Sebagai contoh,

    tag -> commit

  • "Pohon-ish" adalah pengenal yang pada akhirnya mengarah ke objek pohon (yaitu direktori).

    tag -> commit -> project-root-directory

Karena objek komit selalu menunjuk ke objek pohon direktori (direktori akar proyek Anda), setiap pengenal yang "komit-ish", menurut definisi, juga "pohon-ish". Dengan kata lain, setiap pengenal yang mengarah ke objek komit juga dapat digunakan untuk mengarahkan ke objek pohon (sub) direktori .

Tetapi karena objek pohon direktori tidak pernah menunjuk ke komit dalam sistem versi Git, tidak setiap pengenal yang menunjuk ke pohon (sub) direktori juga bisa digunakan untuk menunjuk ke komit. Dengan kata lain, himpunan pengenal "commit-ish" adalah himpunan bagian ketat dari himpunan pengenal "tree-ish".

Seperti yang dijelaskan dalam dokumentasi ( terima kasih kepada Trebor karena telah membantu saya menemukannya ):

<tree>

Menunjukkan nama objek pohon.

<commit>

Menunjukkan nama objek komit.

<tree-ish>

Menunjukkan pohon, komit atau nama objek tag. Perintah yang mengambil <tree-ish> argumen pada akhirnya ingin beroperasi pada <tree>objek tetapi secara otomatis referensi <commit>dan <tag>objek yang mengarah ke a <tree>.

<commit-ish>

Menunjukkan nama objek komit atau tag. Perintah yang mengambil <commit-ish> argumen pada akhirnya ingin beroperasi pada <commit>objek tetapi secara otomatis mendereferensi <tag>objek yang mengarah ke a <commit>.

Kumpulan pengenal tree-ish yang tidak dapat digunakan sebagai commit-ish adalah

  1. <rev>:<path>, yang mengarah langsung ke pohon direktori, bukan objek komit. Misalnya HEAD:subdirectory,.

  2. Pengenal Sha1 dari objek pohon direktori .


Bagaimana dengan entri 16 di meja Anda? Apakah itu berarti Anda tidak yakin apakah itu pohon atau bukan? Angka 0 mengacu pada status gabungan, dan konsep ini hanya berlaku untuk blob, karena indeks bahkan tidak berisi direktori. Lihat: stackoverflow.com/a/25806452/895245 . Jadi pertanyaannya kemudian adalah: apakah semua gumpalan-gumpalan juga merupakan pohon-pohon? Sejauh yang saya tahu ya: semua halaman man yang menggunakan <tree-ish>menerima baik, dan man gitrevisionsmendefinisikan: trees ("directories of files").
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Perhatikan bahwa git-archivemengatakan dibutuhkan <tree-ish>tetapi tidak mengizinkan a <sha1>. Jadi saya kira itu seharusnya meminta <tree-ish-ish>. stackoverflow.com/a/12073669/680464
juanitogan

Namun saya bertanya-tanya tentang apa yang terjadi ketika saya menggunakan <rev>: (tanpa jalur apa pun ?. Ini berfungsi seperti yang dicoba - tetapi saya tidak dapat menemukan bagian yang relevan dalam dokumentasi.
Martin Vejmelka

49

Pohon-ish adalah cara menamai pohon tertentu yang dapat berupa salah satu dari berikut ini:

  • Referensi seperti:
    • KEPALA
    • Tag
    • Nama cabang
    • Nama cabang dengan remote, seperti origin/somebranch
  • Hash
  • Hash pendek

Selain itu, salah atas dapat ditambahkan dengan ^, ~. Referensi juga dapat menggunakan @{}notasi untuk beberapa fitur tambahan:

  • HEAD^atau HEAD^1akan diselesaikan ke orang tua pertama dari HEAD.
  • HEAD^2 akan diselesaikan dengan orang tua kedua
  • HEAD^3akan menyelesaikan ke induk ketiga dan seterusnya, yang lebih langka dan produk bergabung dengan strategi gurita .
  • HEAD~atau HEAD~1akan menyelesaikan ke orang tua pertama dari kepala
  • HEAD~2akan menyelesaikan ke orang tua pertama dari orang tua pertama dari HEAD. Ini akan sama denganHEAD^^
  • HEAD@{0} akan menyelesaikan ke HEAD saat ini
  • HEAD@{1}akan menyelesaikan ke kepala sebelumnya. Ini hanya dapat digunakan oleh referensi karena menggunakan log referensi. Dalam kasus HEADsetiap komit, gabung, checkout akan mengubah nilai HEAD dan dengan demikian menambahkannya ke log. git reflog HEADakan menampilkan log referensi di mana Anda dapat melihat semua gerakan HEAD dan dengan benar apa @{1}dan seterusnya akan menyelesaikannya.

Sebagian besar di atas dapat lebih digabungkan selama itu masuk akal dalam repositori Anda, misalnya: HEAD@{2}~3, somebranch^2~4, c00e66e~4^2, anotherbranch~^~^~^.

Jadi salah satu yang dijelaskan di atas, dan kombinasinya, adalah apa yang dimaksud dalam dokumentasi sebagai pohon-ish, yang hanya cara untuk mengatakan pohon (atau revisi) apa yang harus digunakan untuk sebagian besar perintah git.

Info selengkapnya di Pilihan Revisi di buku Git .


1
Jawaban ini menjelaskan revisi (commit-ishes) secara umum dan melewatkan kasus krusial:, master:path/to/directoryyang merupakan tree-ish tetapi bukan commit-ish. Cupcake membuatnya lebih jelas.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

11

Anda mungkin ingin

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

Ungkapannya master/footidak masuk akal: masteradalah nama cabang dan foonama direktori, seperti yang saya duga.

Edit : (Tautan rusak yang dihapus. Lihat komentar.)


Kata "pohon" tidak lagi ditemukan di tautan "Git Treeishes" Anda. FYI
Robert

Treeish umumnya mengacu pada pohon revisi, bukan pada tata letak direktori.
Jürgen Strobel

6
@ JürgenStrobel: Itu tidak benar. Ini merujuk pada tidak satu pun dari keduanya - dalam bentuk lampau, karena istilah tersebut tidak digunakan lagi dalam versi dokumentasi saat ini. (Itu juga mengapa link rusak.) Dahulu, seorang treeish disebut sesuatu yang bisa diselesaikan dengan objek pohon di toko objek git ini. Ini termasuk spesifikasi komit apa pun, karena setiap komit merujuk ke satu objek pohon. Objek pohon berisi informasi tentang pohon direktori dari komit ini - lihat bagian objek git di "Pro Git" untuk detailnya.
Sven Marnach

6

Untuk definisi <tree-ish>dan <commit-ish>lihat halaman manual git (1) . Anda harus mencari istilahnya. Secara umum <tree-ish>berarti referensi ke objek pohon git, tetapi jika Anda meneruskan jenis objek yang mereferensikan pohon (seperti komit atau cabang), git akan secara otomatis menggunakan pohon referensi.


Dan gitrevisions(7).
Xiong Chiamiov

0

Saya seorang pemula dalam kendali sumber dan git. Ini yang saya tahu. Pohon adalah struktur file dalam repositori. Ini mirip dengan direktori dalam sistem file. Lihat - Alat git mana yang menghasilkan tampilan hierarki ini?

Tree-ish artinya seperti pohon. Ini merujuk pada bagian atau komit dari pohon. Anda dapat mereferensikan komit menggunakan salah satu dari berikut ini: lengkap atau sebagian dari hash SHA-1 dari komit, penunjuk HEAD, referensi cabang, referensi tag. Metode lain menggunakan salah satu metode yang disebutkan bersama dengan leluhur atau orang tua komit. Contoh leluhur: masukkan deskripsi gambar di sini


0

Dari Git Glosarium tree-ish adalah "Objek pohon atau objek yang dapat direferensikan secara rekursif ke objek pohon." komit, HEAD dan tag adalah contoh objek tree-ish.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.