Git में ट्री-ईश का क्या अर्थ है?


122

मैं बहुत उलझन में हूं कि कैसे उपयोग किया जाए git archive

मेरे पास शीर्ष स्तर पर फ़ोल्डर फू , बार और बाज के साथ एक गिट रिपॉजिटरी है। मैं जल्दी परीक्षण तैनाती के लिए एक SVN-ish तरह से फ़ोल्डर फू निर्यात करने की आवश्यकता है ।

मुझे पता चला कि मैं SVN-ish निर्यात प्रकारgit-archive में उपयोग कर सकता हूं ।

लेकिन यहाँ बात है, निम्नलिखित ठीक काम करता है:

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

यह गंतव्य फ़ोल्डर में फू , बार , बाज फ़ोल्डर में परिणाम है ।

हालांकि, निम्नलिखित बाहर त्रुटि होगा साथ fatal not a valid object name:

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

दस्तावेज़ीकरण

इस git archiveकार्यक्रम के लिए सारांश के रूप में देख रहा हूं कि यह <tree-ish> [path]एक पैरामीटर के रूप में ले सकता है (प्रासंगिक भागों के लिए सारांशित सारांश):

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

यदि master/foo नहीं है tree-ish, तो क्या है?


2
master:fooट्री-ईश है, लेकिन आप बेहतर उपयोग करते हैं master fooजैसे मैं <tree-ish> <path>
याकूब नारबस्की

1
मैंने [पथ-ईश> के रूप में और [पथ] विशेषण की व्याख्या की थी। यहीं मैं गलत हो गया। और मेरे द्वारा देखे गए सभी उदाहरणों में केवल <ट्री-ईश> भाग का उपयोग किया गया था, इसलिए मैंने गलत तरीके से मान लिया था कि वे '<ट्री-ईश> मार्ग का उपयोग कर रहे हैं। ओह शब्दार्थ :)
dkinzer


3
मुझे इस प्रश्न से समस्या है क्योंकि शीर्षक इस बारे में पूछता है कि पेड़-ईश क्या होता है, लेकिन तब यह शुरू होता है और मुख्य रूप से कुछ कमांड के लिए लगता है। इसके अलावा, स्वीकृत उत्तर पता नहीं लगता है कि ट्री-ईश शब्द का सही अर्थ क्या है। या तो प्रश्न का शीर्षक बदलना होगा या प्रश्न को बदलना होगा। मेरा सुझाव है कि शीर्षक बेहतर रूप से अनुकूलित है कि प्रश्न वास्तव में क्या है और स्वीकृत उत्तर क्या है। या शायद स्वीकृत उत्तर को बदलकर प्रश्न शीर्षक वास्तव में क्या है। या उत्तर प्रश्न शीर्षक को संबोधित करना चाहिए।
चार्ली पार्कर

@CharlieParker जाहिर तौर पर git archiveकमांड के लिए मैन पेज अब ट्री-ईश का संदर्भ नहीं देते हैं, लेकिन जब मैंने यह सवाल पूछा तो उन्होंने ऐसा किया। और स्वीकृत उत्तर के संबंध में; उस समय किसी और ने सवाल का जवाब देने की जहमत नहीं उठाई। यह दो साल बाद खत्म हो गया था कि एक और जवाब भी पोस्ट किया गया था।
dkinzer

जवाबों:


166

लघु उत्तर (टीएल; डीआर)

"ट्री-ईश" एक शब्द है जो किसी भी पहचानकर्ता को संदर्भित करता है (जैसा कि गिट संशोधन दस्तावेजों में निर्दिष्ट है ) जो अंततः एक (उप) निर्देशिका पेड़ की ओर जाता है (गिट "निर्देशिकाओं को" पेड़ "और" ट्री ऑब्जेक्ट्स "के रूप में संदर्भित करता है)।

मूल पोस्टर के मामले में, foo एक निर्देशिका है जिसे वह निर्दिष्ट करना चाहता है। Git में उप (उप) निर्देशिका निर्दिष्ट करने का सही तरीका इस "ट्री-ईश" सिंटैक्स ( Git के संशोधन दस्तावेज़ से आइटम # 15 ) का उपयोग करना है:

<rev>:<path>जैसे HEAD:README, :README,master:./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 सभी "कमिट-ईश" हैं, क्योंकि वे सभी कमिट करने के लिए नेतृत्व करते हैं, लेकिन क्योंकि कमिट्स डायरेक्टरी ट्री की ओर भी इशारा करते हैं, वे सभी अंततः (सब) डायरेक्टरी ट्री ऑब्जेक्ट्स की ओर जाते हैं, और इसलिए उन्हें "ट्री" के रूप में भी इस्तेमाल किया जा सकता है -ish "।

# 15 का उपयोग ट्री-ईश के रूप में भी किया जा सकता है जब यह एक (उप) निर्देशिका को संदर्भित करता है, लेकिन इसका उपयोग विशिष्ट फ़ाइलों की पहचान करने के लिए भी किया जा सकता है। जब यह फ़ाइलों को संदर्भित करता है, तो मुझे यकीन नहीं है कि यह अभी भी "ट्री-ईश" माना जाता है, या यदि "बूँद-ईश" की तरह कार्य करता है (Git फ़ाइलों को "ब्लॉब्स" के रूप में संदर्भित करता है)।

दीर्घ उत्तर

अपने न्यूनतम स्तरों पर, Git चार मूलभूत वस्तुओं का उपयोग करके स्रोत कोड का ट्रैक रखता है:

  1. एनोटेट टैग, जो इंगित करता है।
  2. Commits, जो आपके प्रोजेक्ट के रूट डायरेक्टरी ट्री को इंगित करता है।
  3. पेड़, जो निर्देशिका और उपनिर्देशिका हैं।
  4. बूँदें, जो फाइलें हैं।

इन ऑब्जेक्ट्स में से प्रत्येक की अपनी स्वयं की sha1 हैश आईडी है, क्योंकि Linus Torvalds ने Git को एक सामग्री- पता करने योग्य फाइल सिस्टम की तरह डिज़ाइन किया है , अर्थात फ़ाइलों को उनकी सामग्री के आधार पर पुनर्प्राप्त किया जा सकता है (sha1 ID फ़ाइल सामग्री से उत्पन्न होती है)। प्रो गिट पुस्तक इस उदाहरण आरेख देता है :

प्रो गिट पुस्तक से 9-3 चित्र

कई Git कमांड कमिट और (उप) डायरेक्टरी ट्री के लिए विशेष पहचानकर्ता स्वीकार कर सकते हैं:

  • "कमिट-ईश" पहचानकर्ता हैं जो अंततः एक प्रतिबद्ध वस्तु का नेतृत्व करते हैं। उदाहरण के लिए,

    tag -> commit

  • "ट्री-ईश" पहचानकर्ता हैं जो अंततः पेड़ (यानी निर्देशिका) वस्तुओं की ओर ले जाते हैं।

    tag -> commit -> project-root-directory

क्योंकि प्रतिबद्ध वस्तुएं हमेशा एक निर्देशिका ट्री ऑब्जेक्ट (आपकी परियोजना की मूल निर्देशिका) को इंगित करती हैं, कोई भी पहचानकर्ता जो "प्रतिबद्ध-ईश" है, परिभाषा के अनुसार, "ट्री-ईश" भी है। दूसरे शब्दों में, किसी भी पहचानकर्ता जो एक प्रतिबद्ध वस्तु की ओर जाता है, का उपयोग एक (उप) डायरेक्टरी ट्री ऑब्जेक्ट का नेतृत्व करने के लिए भी किया जा सकता है

लेकिन चूंकि डाइरेक्ट ट्री ऑब्जेक्ट्स कभी भी Git के वर्जनिंग सिस्टम में कमिट करने की ओर इशारा नहीं करते हैं, न कि प्रत्येक पहचानकर्ता जो एक (सब) डायरेक्टरी ट्री की ओर इशारा करता है, उसे कमिट करने के लिए भी इस्तेमाल किया जा सकता है। दूसरे शब्दों में, "कमिट-ईश" पहचानकर्ताओं का सेट "ट्री-ईश" पहचानकर्ताओं के सेट का एक सख्त उपसमुच्चय है।

जैसा कि प्रलेखन में समझाया गया है ( मुझे खोजने में मदद करने के लिए ट्रेबोर का धन्यवाद ):

<tree>

एक ट्री ऑब्जेक्ट नाम इंगित करता है।

<commit>

एक प्रतिबद्ध वस्तु नाम इंगित करता है।

<tree-ish>

एक पेड़, कमिट या ऑब्जेक्ट नाम का संकेत देता है। एक कमांड जो एक <tree-ish> तर्क लेता है, अंततः एक <tree>वस्तु पर काम करना चाहता है, लेकिन स्वचालित रूप से dereferences <commit>और <tag>ऑब्जेक्ट जो एक बिंदु पर होते हैं <tree>

<commit-ish>

एक प्रतिबद्ध या टैग ऑब्जेक्ट नाम इंगित करता है। एक कमांड जो एक <commit-ish> तर्क लेता है, अंततः एक <commit>ऑब्जेक्ट पर काम करना चाहता है, लेकिन स्वचालित रूप से <tag>ऑब्जेक्ट्स को इंगित करता है जो ए पर इंगित करता है <commit>

कि पेड़-ish पहचानकर्ता के सेट के रूप में इस्तेमाल नहीं किया जा सकता प्रतिबद्ध-ish हैं

  1. <rev>:<path>है, जो सुराग सीधे निर्देशिका के पेड़ के लिए, वस्तुओं का वायदा नहीं किया। उदाहरण के लिए, HEAD:subdirectory

  2. निर्देशिका वृक्ष वस्तुओं के Sha1 पहचानकर्ता ।


आपकी मेज पर 16 प्रविष्टि के बारे में क्या? क्या इसका मतलब है कि आपको यकीन नहीं है कि यह एक पेड़-ईश है या नहीं? 0 मर्ज स्थिति को संदर्भित करता है, और यह अवधारणा केवल blobs पर लागू होती है, क्योंकि अनुक्रमणिका में निर्देशिका भी नहीं होती है। देखें: stackoverflow.com/a/25806452/895245 । तो सवाल फिर नीचे आता है: सभी बूँद-ईश भी पेड़-राख हैं? जहाँ तक मैं बता सकता हूँ हाँ: सभी मैन पेज जो <tree-ish>दोनों को स्वीकार करते हैं, और man gitrevisionsपरिभाषित करते हैं trees ("directories of files"):।
सिरो सेंटिल्ली 郝海东 i iro i 法轮功 '

ध्यान दें कि git-archiveयह कहता है <tree-ish>लेकिन यह एक नापसंद है <sha1>। इसलिए मुझे लगता है कि इसके बजाय एक के लिए पूछना चाहिए <tree-ish-ish>stackoverflow.com/a/12073669/680464
juanitogan

हालाँकि मुझे आश्चर्य है कि क्या होता है जब मैं <Rev> का उपयोग करता हूं: (किसी भी पथ के बिना? यह कोशिश के रूप में काम करता है - लेकिन मैं प्रलेखन में कोई अनुभाग नहीं पा सकता हूं।
मार्टिन वेजमेलका

49

ट्री-ईश एक विशिष्ट पेड़ के नामकरण का एक तरीका है जो निम्नलिखित में से एक हो सकता है:

  • संदर्भ जैसे:
    • सिर
    • टैग
    • शाखा के नाम
    • रीमोट के साथ शाखा के नाम, जैसे origin/somebranch
  • हैश
  • शॉर्ट हैश

उस के शीर्ष पर, ऊपर से किसी के साथ संलग्न किया जा सकता ^, ~। संदर्भ @{}कुछ अतिरिक्त सुविधाओं के लिए संकेतन का उपयोग कर सकते हैं :

  • HEAD^या HEAD^1HEAD के पहले अभिभावक को हल किया जाएगा।
  • HEAD^2 दूसरे माता-पिता को हल करेगा
  • HEAD^3तीसरे अभिभावक वगैरह का समाधान करेंगे, जो ऑक्टोपस की रणनीति के साथ विलय के अधिक दुर्लभ और उत्पाद हैं ।
  • HEAD~या HEAD~1सिर के पहले माता-पिता को हल करेगा
  • HEAD~2HEAD के पहले अभिभावक के पहले माता-पिता को हल करेगा। यह वैसा ही होगाHEAD^^
  • HEAD@{0} वर्तमान HEAD का समाधान करेगा
  • HEAD@{1}पिछले सिर को हल करेगा। यह केवल संदर्भ द्वारा उपयोग किया जा सकता है क्योंकि यह संदर्भ लॉग का उपयोग करता है। HEADहर कमिट के मामले में , मर्ज, चेकआउट HEAD के मूल्य को बदल देगा और इस तरह इसे लॉग में जोड़ देगा। git reflog HEADसंदर्भ लॉग प्रदर्शित करेगा जहां आप HEAD के सभी आंदोलनों को देख सकते हैं और ठीक से क्या @{1}और इसी तरह का समाधान करेंगे।

: इसके बाद के संस्करण के अधिकांश आगे तक जोड़ा जा सकता है, क्योंकि यह आपके भंडार में समझ में आता है, उदाहरण के लिए HEAD@{2}~3, somebranch^2~4, c00e66e~4^2, anotherbranch~^~^~^

तो ऊपर वर्णित किसी भी, और इसके संयोजन, का मतलब है कि प्रलेखन में एक पेड़-ईश के रूप में है, जो सिर्फ यह कहने का एक तरीका है कि पेड़ (या संशोधन) वह है जो कि अधिकांश कमांड के लिए उपयोग किया जाना चाहिए।

Git पुस्तक में संशोधन चयन में अधिक जानकारी ।


1
इस उत्तर सामान्य रूप में संशोधन (प्रतिबद्ध-ISHES) बताते हैं और महत्वपूर्ण मामले याद करते हैं: master:path/to/directoryहै, जो एक पेड़-ish नहीं बल्कि एक प्रतिबद्ध-ish है। कपकेक वह स्पष्ट करता है।
Ciro Santilli 郝海东 冠状 iro i 法轮功 '

11

आप शायद चाहते हैं

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

अभिव्यक्ति का master/fooकोई मतलब नहीं है: masterएक शाखा का नाम है और fooएक निर्देशिका नाम है, जैसा कि मुझे लगता है।

संपादित करें : (टूटी लिंक हटा दी गई। टिप्पणियां देखें)


"ट्री" शब्द अब आपके "गिट ट्रीसिस" लिंक पर नहीं मिलता है। FYI करें
रॉबर्ट

ट्रीइश आमतौर पर संशोधन ट्री को संदर्भित करता है, न कि डायरेक्टरी लेआउट को।
जुरगेन स्ट्रोबेल

6
@ JürgenStrobel: यह सच नहीं है। यह दोनों में से किसी को भी पिछले तनाव में नहीं कहा गया है, क्योंकि इस शब्द का उपयोग प्रलेखन के वर्तमान संस्करण में नहीं किया गया है। (यही कारण है कि लिंक भी टूट गया है।) पूर्व में, एक ट्रीश को कुछ ऐसी चीज़ों के लिए संदर्भित किया जाता है जिसे गिट ऑब्जेक्ट ऑब्जेक्ट में ट्री ऑब्जेक्ट के लिए हल किया जा सकता है। यह किसी भी प्रतिबद्ध विनिर्देश को लागू करता है, क्योंकि प्रत्येक प्रतिबद्ध एक एकल वृक्ष वस्तु को संदर्भित करता है। ट्री ऑब्जेक्ट में इस कमिट के डायरेक्टरी ट्री के बारे में जानकारी है - विवरण के लिए "प्रो गिट" में गिट ऑब्जेक्ट पर सेक्शन देखें।
स्वेन मार्नाच

6

Git (1) मैन पेज की परिभाषा के लिए <tree-ish>और <commit-ish>देखें । आपको शर्तों को खोजना होगा। सामान्य तौर पर एक गिट ट्री ऑब्जेक्ट का एक संदर्भ है, लेकिन यदि आप एक प्रकार की वस्तु को पास करते हैं जो एक पेड़ (जैसे कि एक प्रतिबद्ध या शाखा) का संदर्भ देता है, तो गिट स्वचालित रूप से संदर्भित पेड़ का उपयोग करेगा।<tree-ish>


और gitrevisions(7)
Xiong Chiamiov

0

मैं एक नौसिखिया हूँ जो स्रोत नियंत्रण और गिट है। यह मुझे पता है। एक पेड़ एक भंडार में फाइलों की संरचना है। एक फ़ाइल सिस्टम में एक निर्देशिका के समान है ।ee - किस गिट टूल ने इस ट्री व्यू को उत्पन्न किया?

ट्री-ईश का मतलब पेड़ की तरह होता है। यह एक पेड़ के एक हिस्से या प्रतिबद्ध का संदर्भ देता है। आप इनमें से किसी एक का उपयोग करके एक कमिट का संदर्भ दे सकते हैं: SHA-1 हैश का एक कमिट, HEAD पॉइंटर, शाखा संदर्भ, टैग संदर्भ का हिस्सा। एक अन्य विधि पूर्वजों या एक प्रतिबद्ध माता-पिता के साथ उल्लिखित विधियों में से किसी का उपयोग करती है। पूर्वजों का उदाहरण: यहाँ छवि विवरण दर्ज करें


0

से Git शब्दावली पेड़-ish "एक पेड़ वस्तु या किसी वस्तु कि रिकर्सिवली एक पेड़ वस्तु को dereferenced किया जा सकता है।" प्रतिबद्ध, HEAD और टैग ट्री-ईश वस्तुओं के उदाहरण हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.