पहले निम्नलिखित आदेशों की कोशिश करें (यदि आवश्यक हो तो फिर से चलाएं):
$ git fsck --full
$ git gc
$ git gc --prune=today
$ git fetch --all
$ git pull --rebase
और फिर आप अभी भी समस्या है, कोशिश कर सकते हैं:
सभी भ्रष्ट वस्तुओं को हटा दें, जैसे
fatal: loose object 91c5...51e5 (stored in .git/objects/06/91c5...51e5) is corrupt
$ rm -v .git/objects/06/91c5...51e5
सभी खाली वस्तुओं को हटा दें, जैसे
error: object file .git/objects/06/91c5...51e5 is empty
$ find .git/objects/ -size 0 -exec rm -vf "{}" \;
एक "टूटी हुई कड़ी" संदेश की जाँच करें:
git ls-tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
यह आपको बताता है कि भ्रष्ट बूँद किस फ़ाइल से आई है!
फ़ाइल को पुनर्प्राप्त करने के लिए, आप वास्तव में भाग्यशाली हो सकते हैं, और यह वह संस्करण हो सकता है जिसे आपने पहले से ही अपने काम के पेड़ में देख लिया है:
git hash-object -w my-magic-file
फिर से, और अगर यह लापता SHA1 (4b945 ..) का उत्पादन करता है तो आप अब सब कर चुके हैं!
यह मानते हुए कि यह कुछ पुराना संस्करण था जो टूट गया था, इसे करने का सबसे आसान तरीका है:
git log --raw --all --full-history -- subdirectory/my-magic-file
और वह आपको उस फ़ाइल के लिए पूरी लॉग दिखाएगा (कृपया महसूस करें कि आपके पास जो पेड़ था वह शीर्ष स्तर का पेड़ नहीं हो सकता है, इसलिए आपको यह पता लगाने की आवश्यकता है कि यह आपके पास किस उपनिर्देशिका पर है), तो अब आप इसे फिर से बना सकते हैं हैश-ऑब्जेक्ट के साथ फिर से गायब वस्तु।
लापता कॉम, पेड़ों या बूँद के साथ सभी रेफ की सूची प्राप्त करने के लिए:
$ git for-each-ref --format='%(refname)' | while read ref; do git rev-list --objects $ref >/dev/null || echo "in $ref"; done
हो सकता है कि नियमित शाखा -d या टैग -d कमांड का उपयोग करते हुए उनमें से कुछ को हटाना संभव न हो, क्योंकि भ्रष्टाचार की सूचना मिलने पर वे मर जाएंगे। इसलिए प्लंबिंग कमांड git update-ref -d $ ref के स्थान पर उपयोग करें। ध्यान दें कि स्थानीय शाखाओं के मामले में, यह कमांड .it / config में बासी शाखा विन्यास को पीछे छोड़ सकती है। इसे मैन्युअल रूप से हटाया जा सकता है ([शाखा "$ रेफ"] अनुभाग के लिए देखें)।
सभी Refs साफ होने के बाद भी reflog में टूटे हुए कमिट्स हो सकते हैं। आप git reflog expire --expire = now --all का उपयोग करके सभी रिफ्लेक्स को साफ कर सकते हैं। यदि आप अपने सभी रिफ्लॉग्स को खोना नहीं चाहते हैं, तो आप टूटे हुए रिफॉल्स के लिए अलग-अलग रेफरी खोज सकते हैं:
$ (echo HEAD; git for-each-ref --format='%(refname)') | while read ref; do git rev-list -g --objects $ref >/dev/null || echo "in $ref"; done
(नोट-रि-लिस्ट को जोड़ने के लिए -g विकल्प पर ध्यान दें।) फिर, git reflog expire --expire = का उपयोग करें, अब उनमें से प्रत्येक पर $ ref। जब सभी टूटे हुए रिफ्लेक्स और रिफ्लॉज चले जाते हैं, तो रिपॉजिटरी साफ है यह जांचने के लिए git fsck --full चलाएं। डंकलिंग ऑब्जेक्ट ठीक हैं।
नीचे आप उन कमांडों का उन्नत उपयोग पा सकते हैं जो संभावित रूप से आपके गिट रिपॉजिटरी में आपके डेटा के खो जाने का कारण बन सकते हैं यदि बुद्धिमानी से उपयोग नहीं किया जाता है, तो इससे पहले कि आप गलती से आपके गिट को नुकसान पहुंचाएं, इससे पहले एक बैकअप बनाएं। यदि आप जानते हैं कि आप क्या कर रहे हैं तो अपने जोखिम पर प्रयास करें।
लाने के बाद अपस्ट्रीम शाखा के शीर्ष पर वर्तमान शाखा खींचने के लिए:
$ git pull --rebase
आप नई शाखा की जांच करने और पुराने को हटाने का भी प्रयास कर सकते हैं:
$ git checkout -b new_master origin/master
हटाने के लिए git में दूषित ऑब्जेक्ट को खोजने के लिए, निम्न आदेश का प्रयास करें:
while [ true ]; do f=`git fsck --full 2>&1|awk '{print $3}'|sed -r 's/(^..)(.*)/objects\/\1\/\2/'`; if [ ! -f "$f" ]; then break; fi; echo delete $f; rm -f "$f"; done
OSX के लिए, के sed -E
बजाय का उपयोग करें sed -r
।
अन्य विचार यह है कि सभी ऑब्जेक्ट्स को पैक फ़ाइलों से खोलना है। सभी ऑब्जेक्ट्स को .गित / ऑब्जेक्ट्स के अंदर पुन: उत्पन्न करने के लिए, इसलिए अपनी रिपॉजिटरी के भीतर निम्नलिखित कमांड्स चलाने की कोशिश करें:
$ cp -fr .git/objects/pack .git/objects/pack.bak
$ for i in .git/objects/pack.bak/*.pack; do git unpack-objects -r < $i; done
$ rm -frv .git/objects/pack.bak
यदि ऊपर मदद नहीं करता है, तो आप किसी अन्य रेपो से git ऑब्जेक्ट्स को rsync या कॉपी करने का प्रयास कर सकते हैं, जैसे
$ rsync -varu git_server:/path/to/git/.git local_git_repo/
$ rsync -varu /local/path/to/other-working/git/.git local_git_repo/
$ cp -frv ../other_repo/.git/objects .git/objects
टूटी हुई शाखा को ठीक करने के लिए जब चेकआउट करने की कोशिश की जा रही है:
$ git checkout -f master
fatal: unable to read tree 5ace24d474a9535ddd5e6a6c6a1ef480aecf2625
इसे हटाने की कोशिश करें और फिर से अपस्ट्रीम से चेकआउट करें:
$ git branch -D master
$ git checkout -b master github/master
मामले में अगर गिट आपको अलग राज्य में मिलता है, तो चेकआउट करें master
और इसे अलग शाखा में मिला दें।
एक अन्य विचार मौजूदा मास्टर को पुनरावर्ती रूप से वापस करना है:
$ git reset HEAD --hard
$ git rebase -s recursive -X theirs origin/master
यह सभी देखें:
.git
पाठ्यक्रम के फ़ोल्डर को छोड़कर ) से सभी फाइलों को नए सिरे से क्लोन किए गए रेपो में कॉपी करें। ... और फिरgit status
नए रेपो में किया ... जीआईटी ने मेरी फाइलों में सभी प्रभावित परिवर्तनों का सही पता लगाया और मैं अपना काम फिर से शुरू कर सकता हूं।