मैं एक इंटरैक्टिव गिट ट्यूटोरियल पर काम कर रहा हूं जो उपयोगकर्ता सीखता है कि निर्देशों की एक श्रृंखला का पालन करके और वास्तविक गिट भंडार का संचालन करके गिट का उपयोग कैसे करें। शिक्षार्थी को रिपॉजिटरी को बर्बाद करने या गलत कदम उठाने से रोकने के लिए (और ट्यूटोरियल को जारी नहीं रखा जा सकता है), मैं हर कुछ चरणों के बीच रिपोजिटरी (रेफरी, इंडेक्स और हेड इत्यादि) की स्थिति का स्नैपशॉट लेने और रीसेट करने के बारे में सोच रहा हूं। आखिरी तक जब कुछ अप्रत्याशित होता है।

जैसा कि रेपो का स्नैपशॉट लेना मेरे लिए .git फ़ोल्डर के लिए किसी प्रकार का संस्करण नियंत्रण करने जैसा लगता है, मैं सोच रहा हूं कि क्या काम करने के लिए किसी संस्करण नियंत्रण उपकरण का उपयोग करना संभव है?

मैंने एक और गिट रेपो के अंदर एक गिट रेपो डालने की कोशिश की है, और सेट बच्चे के .git फ़ोल्डर को शामिल करने के लिए माता-पिता रेपो का .gitignore, लेकिन कोई भाग्य नहीं है। git status ट्रैक न की गई निर्देशिका के रूप में .git नहीं दिखाता है।

किसी भी विचार को सुनकर खुशी होगी जो मुझे .git फ़ोल्डर या ट्रिक्स के स्नैपशॉट लेने में मदद कर सकता है ताकि गिट रेपो की स्थिति को संरक्षित किया जा सके और बाद में इसे वापस लागू किया जा सके।

1 संपादित करें

git add -f को जोड़ने के लिए .git फ़ोल्डर को जोड़ने की कोशिश की, लेकिन git ने इसे जोड़ने से इनकार कर दिया और एक त्रुटि संदेश फेंक दिया।

सौभाग्य से, एक और वास्तव में गूंगा चाल काम करती है। किसी अन्य नाम के लिए .git का नाम बदलना एक सामान्य फ़ोल्डर के रूप में व्यवहार करने के लिए git को ट्रिक करने के लिए पर्याप्त होगा। यह मेरे लिए एक स्वीकार्य समाधान है, लेकिन सही नहीं है।

ऐसा कहा जा रहा है, चूंकि @ErikMD ने उल्लेख किया है कि .git की प्रतिलिपि बनाकर गिट रिपोजिटरी स्थिति को संरक्षित करने का मेरा प्रयास पहली नजर में संभव नहीं लगता है, मैं सोच रहा हूं कि क्या मैंने कुछ महत्वपूर्ण अनदेखी की है? क्या संस्करण नियंत्रण टोल के साथ .git को प्रबंधित करके git रिपॉजिटरी के स्नैपशॉट रखने में कोई समस्या होगी?

2
YAC 25 जिंदा 2019, 04:07

1 उत्तर

सबसे बढ़िया उत्तर

आपका "वर्कअराउंड" पहली नजर में संभव नहीं लगता है (यदि आप पैरेंट गिट रेपो में निहित .git सबफ़ोल्डर करने का प्रयास करते हैं, तो आपको किसी प्रकार का (टूटा हुआ) गिट-सबमॉड्यूल मिलेगा ...)

अधिक सटीक होने के लिए: Git को .git फ़ोल्डरों की निम्न-स्तरीय सामग्री को नियमित फ़ाइलों के रूप में ट्रैक करने के लिए डिज़ाइन नहीं किया गया है। इसके बजाय, Git एक रूट रिपॉजिटरी में कई रिपॉजिटरी (कई सबफ़ोल्डर्स जिसमें खुद को एक .git सबफ़ोल्डर) शामिल करने की अनुमति देता है। यह तथाकथित git सबमॉड्यूल फीचर से मेल खाती है। लेकिन एक सबमॉड्यूल को सही ढंग से सेट करने के लिए समर्पित कमांड का उपयोग करने की आवश्यकता होती है, जो बदले में एक विशेष फ़ाइल .gitmodules को भी अपडेट करता है। इसलिए जो मैंने पहले कहा था कि यदि आप सामान्य वर्कफ़्लो का पालन नहीं करते हैं तो आप "टूटा हुआ गिट-सबमॉड्यूल लेआउट" प्राप्त कर सकते हैं। दरअसल, git subtree.

हालांकि मुझे लगता है कि आप git reflog या संबंधित कमांड को पुनर्स्थापित करने के लिए = इतिहास, अनुक्रमणिका, और कार्यशील निर्देशिका (रिपॉजिटरी के 3 मुख्य भाग) के साथ-साथ शाखाओं और टैग को अधिलेखित करें ...

मेरे सुझाव का उदाहरण देने के लिए, मान लीजिए कि हम केवल एक शाखा से निपटते हैं:

  1. वर्तमान सक्रिय शाखा (HEAD) की "स्थिति" को संबंधित SHA1 द्वारा पहचाना जा सकता है:

    $ git rev-parse --verify HEAD
    0ed45a5994bceea7c6b1d6530c72cd9ce29a46af  # for example
    
  2. मान लीजिए कि उपयोगकर्ता ने गलत कदम उठाया है:

    $ git add UnwantedFile && git commit -m "Unwanted commit"
      # or
    $ git reset --hard HEAD~3  # remove 3 commits by mistake
    

    (और आप इसे उपयुक्त आदेशों का उपयोग करके देखते हैं)

  3. फिर आप काम कर रहे डीआईआर की स्थिति को बहाल कर सकते हैं। + अनुक्रमणिका + वर्तमान शाखा करके:

    $ git reset --hard 0ed45a5994bceea7c6b1d6530c72cd9ce29a46af
    

    (या यदि पहले चरण को याद रखने के लिए पहले चरण 1 का प्रदर्शन नहीं किया गया था, तो रीफ्लॉग आवश्यक संकेत दे सकता है):

    $ git reflog
    d62277c84 HEAD@{0}: reset: moving to HEAD~3
    0ed45a599 HEAD@{1}: checkout: moving from master to V8.8.2
    …
    $ git reset --hard HEAD@{1}
    

समाप्त करने के लिए, मैं केवल तीन तरीके देखता हूं जो आप चाहते हैं:

  1. यदि आप रेपो को रोलबैक करना चाहते हैं, तो रेपो को अधिलेखित करने के लिए मैन्युअल rsync या bash हैक्स का उपयोग करें, लेकिन यह शायद बहुत संतोषजनक नहीं है;
  2. रेपो को तदनुसार रीसेट करने के लिए मानक कमांड जैसे git reset, git branch, git checkout या git tag… (जिस ट्यूटोरियल पर आप काम कर रहे हैं, उसके आधार पर) का उपयोग करें;
  3. या git push --mirror या git pull/git fetch जैसे उपयुक्त कमांड के साथ एक स्थानीय रिमोट (या एक स्थानीय क्लोन, एक तरह से या दूसरे) का उपयोग करें?
0
ErikMD 26 जिंदा 2019, 02:08