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-archive
cara 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 archive
program 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?
git
git-archive
dkinzer.dll
sumber
sumber
master:foo
adalah pohon-ish, tetapi Anda lebih baik menggunakanmaster foo
sebagai i<tree-ish> <path>
.git archive
perintah 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.Jawaban:
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 ):Jadi, dengan kata lain,
master:foo
sintaks yang benar, bukanmaster/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 ):
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:
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 ):
Kumpulan pengenal tree-ish yang tidak dapat digunakan sebagai commit-ish adalah
<rev>:<path>
, yang mengarah langsung ke pohon direktori, bukan objek komit. MisalnyaHEAD:subdirectory
,.Pengenal Sha1 dari objek pohon direktori .
sumber
<tree-ish>
menerima baik, danman gitrevisions
mendefinisikan:trees ("directories of files")
.git-archive
mengatakan dibutuhkan<tree-ish>
tetapi tidak mengizinkan a<sha1>
. Jadi saya kira itu seharusnya meminta<tree-ish-ish>
. stackoverflow.com/a/12073669/680464Pohon-ish adalah cara menamai pohon tertentu yang dapat berupa salah satu dari berikut ini:
origin/somebranch
Selain itu, salah atas dapat ditambahkan dengan
^
,~
. Referensi juga dapat menggunakan@{}
notasi untuk beberapa fitur tambahan:HEAD^
atauHEAD^1
akan diselesaikan ke orang tua pertama dari HEAD.HEAD^2
akan diselesaikan dengan orang tua keduaHEAD^3
akan menyelesaikan ke induk ketiga dan seterusnya, yang lebih langka dan produk bergabung dengan strategi gurita .HEAD~
atauHEAD~1
akan menyelesaikan ke orang tua pertama dari kepalaHEAD~2
akan menyelesaikan ke orang tua pertama dari orang tua pertama dari HEAD. Ini akan sama denganHEAD^^
HEAD@{0}
akan menyelesaikan ke HEAD saat iniHEAD@{1}
akan menyelesaikan ke kepala sebelumnya. Ini hanya dapat digunakan oleh referensi karena menggunakan log referensi. Dalam kasusHEAD
setiap komit, gabung, checkout akan mengubah nilai HEAD dan dengan demikian menambahkannya ke log.git reflog HEAD
akan 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 .
sumber
master:path/to/directory
yang merupakan tree-ish tetapi bukan commit-ish. Cupcake membuatnya lebih jelas.Anda mungkin ingin
Ungkapannya
master/foo
tidak masuk akal:master
adalah nama cabang danfoo
nama direktori, seperti yang saya duga.Edit : (Tautan rusak yang dihapus. Lihat komentar.)
sumber
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.sumber
gitrevisions(7)
.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:
sumber
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.
sumber