मुझे बस यह अनुभव हुआ - मेरी मशीन गिट रेपो में लिखते समय दुर्घटनाग्रस्त हो गई, और यह भ्रष्ट हो गया। मैंने इसे इस प्रकार तय किया।
मैंने यह देखने के साथ शुरुआत की कि मैंने कितने रिमोट पर धकेल दिया था, इस प्रकार:
gitk &
यदि आप इस उपकरण का उपयोग नहीं करते हैं तो यह बहुत आसान है - जहाँ तक मुझे पता है सभी ऑपरेटिंग सिस्टम पर उपलब्ध है। इससे संकेत मिला कि मेरा रिमोट दो कमिट गायब था। इसलिए मैंने नवीनतम रिमोट कमिट को इंगित करते हुए लेबल पर क्लिक किया (आमतौर पर यह होगा /remotes/origin/master
) हैश पाने के लिए (हैश 40 वर्ण लंबा है, लेकिन संक्षिप्तता के लिए मैं यहां 10 का उपयोग कर रहा हूं - यह आमतौर पर वैसे भी काम करता है)।
यह रहा:
14c0fcc9b3
मैं फिर निम्नलिखित कमिट पर क्लिक करता हूं (यानी पहला ऐसा रिमोट जिसके पास नहीं है) और वहां हैश प्राप्त करें:
04d44c3298
फिर मैं इस प्रतिबद्ध के लिए एक पैच बनाने के लिए इन दोनों का उपयोग करता हूं:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
फिर मैंने इसी तरह अन्य गुमशुदा कमिटमेंट के साथ किया, यानी मैंने पहले कमिट का हैश और कमिट का हैश किया:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
मैं फिर एक नई निर्देशिका में चला गया, रिमोट से रेपो क्लोन किया:
git clone git@github.com:username/repo.git
मैंने तब पैच फ़ाइलों को नए फ़ोल्डर में स्थानांतरित किया, और उन्हें लागू किया और उन्हें अपने सटीक प्रतिबद्ध संदेशों के साथ प्रतिबद्ध किया (इन्हें git log
या gitk
खिड़की से चिपकाया जा सकता है ):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
यह मेरे लिए चीजों को बहाल करता है (और ध्यान दें कि शायद यह एक बड़ी संख्या में आवागमन के लिए एक तेज़ तरीका है)। हालाँकि मैं यह देखने का इच्छुक था कि क्या दूषित रेपो में पेड़ की मरम्मत की जा सकती है, और इसका जवाब यह है कि क्या यह हो सकता है। उपरोक्त के रूप में उपलब्ध मरम्मत किए गए रेपो के साथ, टूटे हुए फ़ोल्डर में इस कमांड को चलाएं:
git fsck
आपको कुछ इस तरह मिलेगा:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
मरम्मत करने के लिए, मैं टूटे हुए फ़ोल्डर में ऐसा करूंगा:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
यानी दूषित फ़ाइल को हटा दें और इसे एक अच्छे से बदल दें। आपको यह कई बार करना पड़ सकता है। अंत में एक बिंदु होगा जहां आप fsck
त्रुटियों के बिना चला सकते हैं। आप शायद रिपोर्ट में "झूलते हुए प्रतिबद्ध" और "झूलने वाली बूँद" लाइनें हैं, ये आपके विद्रोह का परिणाम हैं और इस फ़ोल्डर में संशोधन करते हैं, और ठीक हैं। कचरा उठाने वाले को नियत समय में हटा दिया जाएगा।
इस प्रकार (कम से कम मेरे मामले में) एक भ्रष्ट पेड़ का मतलब यह नहीं है कि अप्रकाशित कमिट खो गए हैं।