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:foo
sintaks 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:
- Tag beranotasi, yang mengarah ke komit.
- Komit, yang mengarah ke pohon direktori root proyek Anda.
- Pohon, yaitu direktori dan subdirektori.
- 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 :
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
<rev>:<path>
, yang mengarah langsung ke pohon direktori, bukan objek komit. Misalnya HEAD:subdirectory
,.
Pengenal Sha1 dari objek pohon direktori .
master:foo
adalah pohon-ish, tetapi Anda lebih baik menggunakanmaster foo
sebagai i<tree-ish> <path>
.