Git: "दूषित ढीली वस्तु"


329

जब भी मैं अपने रिमोट से खींचता हूं, मुझे संपीड़न के बारे में निम्न त्रुटि मिलती है। जब मैं मैनुअल कम्प्रेशन चलाता हूँ, तो मुझे वही मिलता है:

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

क्या किसी को पता है, उसके बारे में क्या करना है?

कैट-फाइल से मुझे यह मिलता है:

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

और git fsck से मुझे यह मिलता है (पता नहीं कि क्या यह वास्तव में संबंधित है):

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

किसी को भी यह समझने में मेरी मदद कर सकते हैं?


क्या आपने बाद वाली वस्तु (45ba4ceb93bc812ef20a6630bb27e9e0b33a012a) को देखने का प्रयास किया है?
जिंटुतस मिलियासुक्कास

4
धन्यवाद ... लेकिन एक वस्तु पर "देखो" कैसे होता है? अभी भी नया करने के लिए :) :)
asgerhallas

2
´गित शो f मुझे इससे ज्यादा कुछ नहीं देता है sजित fsck un ने दुर्भाग्यवश पहले ही कर दिया था।
asgerhallas

4
लिनुस टॉर्वाल्ड्स ने इस त्रुटि के बारे में निम्नलिखित सहायक दस्तावेज़ लिखे और यदि आपके पास फ़ाइलें हैं तो मैन्युअल रूप से ब्लॉब्स को फिर से कैसे बनाया जाए
Uwe Kleine-König

2
क्या आप कुछ टिप्पणियों को जोड़ सकते हैं, या संपादित कर सकते हैं, स्वीकृत उत्तर? मैं ठीक उसी स्थिति में हूं, और स्वीकार किए गए उत्तर में "जस्ट वर्क टीएम" के लिए पर्याप्त विवरण नहीं है, लेकिन इसके बजाय मुझे खुद को विवरण में गोता लगाने के लिए मजबूर करना होगा।
ripper234

जवाबों:


57

लगता है कि आपके पास एक भ्रष्ट पेड़ वस्तु है। आपको उस वस्तु को किसी और से प्राप्त करने की आवश्यकता होगी। उम्मीद है कि उनके पास एक अनियंत्रित संस्करण होगा।

आप वास्तव में इसे फिर से संगठित कर सकते हैं यदि आप किसी अन्य व्यक्ति से मान्य संस्करण नहीं खोज सकते हैं जो यह अनुमान लगाता है कि फाइलें क्या होनी चाहिए। आप यह देखना चाहते हैं कि क्या ऑब्जेक्ट्स की तारीखें और समय इससे मेल खाते हैं। वे संबंधित बूँदें हो सकते हैं। आप उन ऑब्जेक्ट्स से ट्री ऑब्जेक्ट की संरचना का अनुमान लगा सकते हैं।

Git internals के बारे में स्कॉट चाकोन के Git Screencasts पर एक नज़र डालें । यह आपको दिखाएगा कि हूड के नीचे गिट कैसे काम करता है और इस जासूसी काम को करने के बारे में कैसे जाना जाता है यदि आप वास्तव में फंस गए हैं और किसी अन्य व्यक्ति से वह वस्तु प्राप्त नहीं कर सकते हैं।


2
इसे पैक फ़ाइल में संग्रहीत किया जा सकता है। यह वह तरीका है जो गिट्टों के भंडारण से वस्तुओं के भंडारण को संकुचित करता है। ढीली वस्तुएं वे हैं जो अभी तक पैकेज में नहीं हैं। पैक फ़ाइलों के लिए Google, अनुक्रमणिका फ़ाइलों को git में और आप जितनी आवश्यकता हो उतने गहरे में गोता लगाने में सक्षम होना चाहिए।
एडम डाइमिट्रुक 18

2
क्या आप चाकोन के गिट स्क्रैनास्ट की ओर अपने उत्तर में एक लिंक प्रदान कर सकते हैं?
एहतेश चौधरी

1
git cat-file -t <SHA1>आपको प्रकार बताएगा। यदि दूषित नहीं है, तो आप git cat-file <type> <SHA1>सामग्री को देखने के लिए कर सकते हैं (मैंने इसे एक के लिए उपयोग किया है blob, मुझे लगता है कि यह आपको अन्य प्रकार की सामग्री भी दिखाएगा।)
कार्ल जी

1
इसके अलावा लिनुस के इस पोस्ट में एक ठीक होने की प्रक्रिया का वर्णन है blob। जब मैंने इन निर्देशों का पालन किया, हालांकि, भले ही मैं सफलतापूर्वक भाग गया था , तब भी git statusजिम्मेदार fatal: unable to read <SHA1>था git hash-object -w <file>(शायद क्योंकि, उनके निर्देशों के अनुसार, मैंने इस ऑब्जेक्ट को दूर स्थानांतरित कर दिया था। इसे वापस करने से मुझे वही corrupt loose objectत्रुटि मिली ।)
कार्ल जी

2
और अब अंग्रेजी में दोहराएं
मेहदी

359

मुझे भी यही समस्या थी (पता नहीं क्यों)।

इस फिक्स के लिए रिपॉजिटरी की एक अनियंत्रित रिमोट कॉपी तक पहुंच की आवश्यकता होती है, और यह आपके स्थानीय रूप से काम करने वाली कॉपी को बरकरार रखेगा।

लेकिन इसमें कुछ कमियां हैं:

  • आप किसी भी ऐसे कमिट्स का रिकॉर्ड खो देंगे जिन्हें पुश नहीं किया गया था, और उन्हें फिर से हासिल करना होगा।
  • आप किसी भी संघर्ष को खो देंगे।

जोड़

अपने रेपो के ऊपर मूल निर्देशिका से इन आदेशों को निष्पादित करें (अपने प्रोजेक्ट फ़ोल्डर के नाम के साथ 'फू' को बदलें):

  1. भ्रष्ट निर्देशिका का बैकअप बनाएँ:
    cp -R foo foo-backup
  2. एक नई निर्देशिका के लिए दूरस्थ रिपॉजिटरी का एक नया क्लोन बनाएं:
    git clone git@www.mydomain.de:foo foo-newclone
  3. दूषित हटाएं। .IT उपनिर्देशिका:
    rm -rf foo/.git
  4. नए क्लोन किए हुए .it सबडायरेक्ट को foo में ले जाएँ:
    mv foo-newclone/.git foo
  5. बाकी अस्थायी नया क्लोन हटाएं:
    rm -rf foo-newclone

विंडोज पर आपको उपयोग करना होगा:

  • copy के बजाय cp -R
  • rmdir /S के बजाय rm -rf
  • move के बजाय mv

अब फू का मूल .gitउपनिर्देशिका वापस आ गया है, लेकिन सभी स्थानीय परिवर्तन अभी भी हैं। git status, commit, pull, push, आदि के रूप में वे चाहिए फिर से काम करते हैं।


11
इस विधि ने मेरे लिए काम किया। हालांकि, मेरा मानना ​​है कि सभी अप्रकाशित कमिट खो गए थे। रेपो डेटा अछूता था।
wonton

30
हां, अनपढ़ प्रतिबद्ध जानकारी खो जाएगी। लेकिन आम परिदृश्यों में (वर्तमान की तुलना में दूसरों में अप्रकाशित परिवर्तनों के साथ कोई भी एकाधिक स्थानीय शाखाएं नहीं), सभी सबसे हालिया फ़ाइल (इंकल डिलीट) अभी भी डिस्क पर हैं, इस प्रकार, कोई भी आसानी से किसी भी पिछले अप्रकाशित कमिट को दोहरा सकता है। चूंकि मैं हमेशा कमिटमेंट के किसी भी क्रम के बाद धक्का देता हूं, इसलिए मैं भी इस मुसीबत में नहीं भागा।
क्यूबिक लेट्यूस

7
सरल और सीधा। यदि आप गिट के बारे में सब कुछ नहीं समझते हैं और आप अपने रिपॉजिटरी के साथ फिडेल नहीं करना चाहते हैं, तो यह IMO, सबसे कारगर उपाय है।
ओलिबॉय 50

4
मुझे लगता है कि यह सभी स्टैग को हटा देगा क्योंकि वे .it उपनिर्देशिका के तहत संग्रहीत हैं।
एंथनी इलियट

4
यदि परियोजना में सबमॉड्यूल्स है, तो .gitफ़ोल्डर को पुनः प्राप्त करने से पहले उन्हें इनिट करना आवश्यक है ।
AdrieanKhisbe 7

242

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

सबसे पहले अपनी स्थानीय फ़ाइलों की एक बैकअप प्रतिलिपि बनाएँ। फिर अपने काम के पेड़ की जड़ से ऐसा करें:

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master  

फिर आवश्यकतानुसार कोई भी परिवर्तित फाइल करें।


12
IMHO यह स्वीकृत उत्तर होना चाहिए। रेपो को हटाने और पुन: क्लोनिंग की तुलना में बहुत आसान है! :) हालाँकि आप किसी भी मंच से हार जाते हैं ...
निक

6
जाहिर है, अगर भ्रष्टाचार होने पर आप मास्टर के अलावा किसी शाखा में थे, तो masterअपनी शाखा का नाम बदल दें ।
तीमुथियुस ज़ोन

ज्यादातर के रूप में काम किया है, लेकिन मैं एक और शाखा पर था workingजब यह भ्रष्ट हो गया और इन कदमों ने मुझे मास्टर के अलावा किसी भी शाखा की स्थानीय प्रतिलिपि नहीं दी (और हाँ मैंने मास्टर को ऊपर से बदलने की कोशिश की थी workingलेकिन वह काम नहीं किया था)। ऊपर दिए गए कदमों के साथ masterअंत किया , फिर मेरे बदलावों को धराशायी किया और कर रहे हैं checkout -b working origin/workingऔर वहाँ की ठोकरें खा रहे हैं। काम किया लगता है - धन्यवाद!
कल्पनाशील

1
मेरी रिपॉजिटरी में एक सबमॉड्यूल था जो भ्रष्ट नहीं था। इस प्रक्रिया भंडार और एक राज्य है जहां इस तरह के आदेश के रूप में अपने submodule छोड़ दिया git statusझुकेंगे fatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub। फाइलसिस्टम से सबमॉड्यूल हटाना और प्रक्रिया को फिर से शुरू करना सामान्य स्थिति को बहाल करता है। संभवत: यह सुनिश्चित करना कि
सबमॉडल्स

5
मैंने आज यह किया और फाइलों में असम्बद्ध परिवर्तनों को नहीं खोया :) (git 2.17.1)
18-14 को Fábio Dias

173

एक वीएम पर काम करते हुए, मेरी नोटबुक में, बैटरी मर गई, यह त्रुटि मिली;

एरर: ऑब्जेक्ट फाइल .गित / ऑब्जेक्ट्स / सीइ / रीफ खाली एरर है: ऑब्जेक्ट फाइल .गित / ऑब्जेक्ट्स / सीइ / रीफ खाली घातक है: लूज ऑब्जेक्ट रीफ (इन .गित / ऑब्जेक्ट्स / सीइ / आरईएफ में संग्रहित) करप्ट है।

मैं केवल 2 कमांडों के साथ और अपना काम खोए बिना रीपो को फिर से प्राप्त करने में कामयाब रहा (संशोधित फ़ाइलें / बिना बदलाव किए)

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin

उसके बाद मैंने एक दौड़ git statusलगाई, रेपो ठीक था और मेरे परिवर्तन थे (इंतजार किया जा रहा है, अभी करो ..)।

git संस्करण 1.9.1

उन सभी परिवर्तनों का बैकअप लें जो आपको याद हैं, बस अगर यह समाधान काम नहीं करता है और अधिक कट्टरपंथी दृष्टिकोण की आवश्यकता है।


10
find .git/objects/ -size 0 -exec rm -f {} \;मेरे लिए काम करता है;)
लजारो फर्नांडिस लीमा सुलेमान

एक ही समस्या थी, कमांड चलाया, मिंट वीएम पर मेरे लिए पूरी तरह से काम किया।
लुडविग रिडाहल

इसके अलावा कुछ और करने के लिए बिना सही काम किया।
हलसफर

1
एक वीएम पर नहीं और यह मेरे लिए कई बार काम कर चुका है। IDK मेरे वर्तमान प्रोजेक्ट में ऐसा क्यों होता है, लेकिन यह हर बार इसे ठीक करता है।
जेम्स एल।

7
आपको git symbolic-ref HEAD refs/heads/master.खाली वस्तुओं को हटाने के बाद चलाने की आवश्यकता हो सकती है ।
Stephan

43

मेरा कंप्यूटर दुर्घटनाग्रस्त हो गया जब मैं एक प्रतिबद्ध संदेश लिख रहा था। रिबूट करने के बाद, काम करने वाला पेड़ था जैसा कि मैंने इसे छोड़ दिया था और मैं अपने परिवर्तनों को सफलतापूर्वक करने में सक्षम था।

हालांकि, जब मैंने दौड़ने की कोशिश की तो git statusमुझे मिल गया

error: object file .git/objects/xx/12345 is empty
fatal: loose object xx12345 (stored in .git/objects/xx/12345 is corrupt

अधिकांश अन्य उत्तरों के विपरीत, मैं किसी भी डेटा को पुनर्प्राप्त करने की कोशिश नहीं कर रहा था । मुझे बस Git की जरूरत थी कि वह खाली वस्तु फ़ाइल के बारे में शिकायत करना बंद कर दे।

अवलोकन

"ऑब्जेक्ट फ़ाइल" एक वास्तविक फ़ाइल का हैश प्रतिनिधित्व है जिसकी आपको परवाह है। Git को लगता है कि इसमें एक some/file.whateverसंग्रहित हैशेड संस्करण होना चाहिए .git/object/xx/12345, और त्रुटि को ठीक करने के लिए ज्यादातर यह पता लगाने की बात होगी कि कौन सी "ढीली वस्तु" फ़ाइल का प्रतिनिधित्व करना चाहिए था।

विवरण

संभव विकल्प लग रहे थे

  1. खाली फ़ाइल हटाएँ
  2. Git के लिए स्वीकार्य राज्य में फ़ाइल प्राप्त करें

दृष्टिकोण 1: ऑब्जेक्ट फ़ाइल को निकालें

पहली चीज़ जो मैंने कोशिश की थी, वह सिर्फ ऑब्जेक्ट फ़ाइल को स्थानांतरित कर रही थी

mv .git/objects/xx/12345 ..

यह काम नहीं किया - एक टूटी हुई कड़ी के बारे में शिकायत करना शुरू कर दिया। दृष्टिकोण 2 पर।

दृष्टिकोण 2: फ़ाइल को ठीक करें

लिनुस टॉर्वाल्ड्स के पास एक शानदार राइटअप है कि कैसे एक ऑब्जेक्ट फ़ाइल को पुनर्प्राप्त करना है जो मेरे लिए समस्या को हल करता है। प्रमुख चरणों को यहाँ संक्षेप में प्रस्तुत किया गया है।

$> # Find out which file the blob object refers to
$> git fsck
broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
           to    blob xx12345
missing blob xx12345

$> git ls-tree 2d926
...
10064 blob xx12345  your_file.whatever

यह आपको बताता है कि खाली वस्तु किस फ़ाइल का हैश होना चाहिए। अब आप इसे सुधार सकते हैं।

$> git hash-object -w path/to/your_file.whatever

ऐसा करने के बाद मैंने जाँच की .git/objects/xx/12345, यह अब खाली नहीं था, और गिट ने शिकायत करना बंद कर दिया।


मैं ऐसी स्थिति में था, जहां मेरे पास मेरे रेपो का कोई रिमोट या बैकअप नहीं था, और जहां प्रारंभिक प्रतिबद्ध के पास भ्रष्ट वस्तु को जोड़ा गया था, शायद वैसे भी पूरे पेड़ को दूषित कर रहा था। मेरे पास एक अलग रेपो में वस्तु को फिर से बनाने की कोशिश करने का अपना तरीका था, लेकिन यह जवाब अधिक चालाकी के साथ उसी परिणाम को प्राप्त करता है।
एस्टेका

13

प्रयत्न

git stash

इसने मेरे लिए काम किया। यह आपके द्वारा किए गए किसी भी चीज को चुरा लेता है और जो समस्या के आसपास है।


अजीब!?! आज सुबह इस त्रुटि के सामने आया। कल प्रतिबद्ध था, इसलिए कोई भी परिवर्तन नहीं हुआ। क्या निम्नलिखित: git stash ... घातक: इनपुट / आउटपुट त्रुटि: '/home/<user>/.git/index.lock' बनाने में असमर्थ touch .git/a स्पर्श: स्पर्श नहीं कर सकता '.git / एक': इनपुट / आउटपुट त्रुटि sudo touch /home/guest/.git/a कोई त्रुटि git stash नहीं स्थानीय परिवर्तन सहेजने के लिए git status ... कुछ भी नहीं करने के लिए, स्वच्छ निर्देशिका काम
go2null 16

1
@ go2null मुझे इस पर थोड़ी देर हो गई है, लेकिन इनपुट / आउटपुट त्रुटियों का आमतौर पर हार्ड ड्राइव मुद्दों का मतलब है। हालाँकि मुझे यकीन है कि आपने अब तक इसका पता लगा लिया है।
आर्सेली

"वर्तमान सूचकांक स्थिति को नहीं बचा सकता है"
व्लादिमीर ब्रासिल

9

एक कचरा संग्रह ने मेरी समस्या तय कर दी:

git gc --aggressive --prune=now

पूरा करने के लिए कुछ समय लगता है, लेकिन हर ढीली वस्तु और / या दूषित सूचकांक तय किया गया था।


यह अच्छा उपाय है। मेरे लिए काम किया। मेरा सिस्टम गलती से बंद हो गया। हालांकि, इस एक आदेश ने मुझे क्लोनिंग और उन सभी भारी कार्यों से बचा लिया। धन्यवाद जागो
मुकेश कुमार

"रेफरी को चलाने में विफल"
व्लादिमीर ब्रासिल

5

बस git pruneमेरे लिए इस मुद्दे को एक निश्चित चल रहा है


यह मेरे लिए काम करता है और सबसे आसान समाधान की तरह लगता है। निश्चित नहीं है कि इस उत्तर को अधिक वोट क्यों नहीं मिले। एकमात्र दोष यह है कि अगला git pullसामान्य से थोड़ा अधिक समय लेता है, मुझे लगता है कि यह कुछ हटाए गए ऑब्जेक्ट या कुछ की जगह ले रहा है।
steev

1
इसका कारण यह हो सकता है कि git prune समस्या का समाधान बिल्कुल नहीं करता है।
user3072843

4

मुझे बस यह अनुभव हुआ - मेरी मशीन गिट रेपो में लिखते समय दुर्घटनाग्रस्त हो गई, और यह भ्रष्ट हो गया। मैंने इसे इस प्रकार तय किया।

मैंने यह देखने के साथ शुरुआत की कि मैंने कितने रिमोट पर धकेल दिया था, इस प्रकार:

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त्रुटियों के बिना चला सकते हैं। आप शायद रिपोर्ट में "झूलते हुए प्रतिबद्ध" और "झूलने वाली बूँद" लाइनें हैं, ये आपके विद्रोह का परिणाम हैं और इस फ़ोल्डर में संशोधन करते हैं, और ठीक हैं। कचरा उठाने वाले को नियत समय में हटा दिया जाएगा।

इस प्रकार (कम से कम मेरे मामले में) एक भ्रष्ट पेड़ का मतलब यह नहीं है कि अप्रकाशित कमिट खो गए हैं।


3

मुझे एक भ्रष्ट ढीली वस्तु त्रुटि भी मिल रही थी।

./objects/x/x

मैंने इसे भ्रष्ट वस्तु की निर्देशिका में सफलतापूर्वक तय किया। मैंने देखा कि उस वस्तु को सौंपा गया उपयोगकर्ता मेरा उपयोगकर्ता नहीं था । मुझे नहीं पता कि यह कैसे हुआ, लेकिन मैं chown git:gitउस फाइल पर चला और फिर यह फिर से काम किया।

यह कुछ लोगों के मुद्दों के लिए एक संभावित सुधार हो सकता है लेकिन उन सभी के लिए आवश्यक नहीं है।


2

मेरे (विंडोज़) मशीन को रिबूट करने का निर्णय लेने के बाद मुझे यह त्रुटि मिली। शुक्र है कि मेरा रिमोट रेपो अप टू डेट था इसलिए मैंने सिर्फ एक ताजा गट-क्लोन किया।



2

मैंने यहां कई अन्य चरणों का पालन किया; लाइनस का वर्णन कैसे गित वृक्ष / वस्तुओं को देखने के लिए और जो कुछ याद नहीं है वह विशेष रूप से उपयोगी था। git-git दूषित बूँद ठीक हो

लेकिन अंत में, मेरे लिए, मेरे पास एक आंशिक डिस्क विफलता के कारण ढीली / भ्रष्ट पेड़ वस्तुएं थीं, और पेड़ की वस्तुएं इतनी आसानी से बरामद नहीं होती हैं / उस डॉक्टर द्वारा कवर नहीं की जाती हैं।

अंत में, मैंने विरोधाभासी objects/<ha>/<hash>तरीके से बाहर चले गए , और git unpack-objectsएक पैक फ़ाइल के साथ एक यथोचित तारीख से क्लोन के साथ उपयोग किया । यह लापता पेड़ की वस्तुओं को पुनर्स्थापित करने में सक्षम था।

फिर भी मुझे बहुत सारे झूलने वाले छाले छोड़ गए, जो पहले से संग्रहीत सामान को अनपैक करने का एक साइड इफेक्ट हो सकता है, और यहां अन्य तरीकों से भी संबोधित किया जा सकता है


2

@ User1055643 के जवाब में अंतिम चरण गायब है:

$ rm -fr .git
$ git init
$ git remote add origin your-git-remote-url
$ git fetch
$ git reset --hard origin/master
$ git branch --set-upstream-to=origin/master master  

क्या है - परेशान-अपस्ट्रीम-एक वैध तर्क के लिए? मुझे ऐसा नहीं लगता!
शरीफ मामून

2
git Branch (--सेट-अपस्ट्रीम-टू = <upstream> | -u <upstream>) [<ब्रांचनेम>]
Ertuğrul Altınboğa

यदि आप .gitक्लोन किए गए प्रोजेक्ट से हटाते हैं और कॉपी करते हैं, तो रेपो काम करेगा, लेकिन कोई स्थानीय शाखाएं, और न ही स्टैम्स संरक्षित किए जाएंगे।
व्लादिमीर वुकानैक

1

हमारे यहां सिर्फ यही मामला था। ऐसा हुआ कि समस्या यह थी कि भ्रष्ट फ़ाइल का स्वामित्व हमारे सामान्य उपयोगकर्ता के बजाय रूट था। यह सर्वर पर किसी के द्वारा "सुडो सु -" करने के बाद की गई प्रतिबद्धता के कारण हुआ था।

सबसे पहले, अपनी भ्रष्ट फ़ाइल की पहचान करें:

$> git fsck --full

आपको इस तरह का उत्तर प्राप्त करना चाहिए:

fatal: loose object 11b25a9d10b4144711bf616590e171a76a35c1f9 (stored in .git/objects/11/b25a9d10b4144711bf616590e171a76a35c1f9) is corrupt

उस फ़ोल्डर में जाएँ जहाँ भ्रष्ट फ़ाइल है और a:

$> ls -la

भ्रष्ट फ़ाइल के स्वामित्व की जाँच करें। यदि यह अलग है, तो बस अपने रेपो की जड़ पर वापस जाएँ और a:

$> sudo chown -R YOURCORRECTUSER:www-data .git/

आशा है ये मदद करेगा!


1

मेरे लिए यह एक बिजली की विफलता के कारण हुआ जबकि एक git push

संदेश इस तरह दिखे:

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

मैंने ऐसी चीजों की कोशिश की, git fsckलेकिन इससे कोई फायदा नहीं हुआ। चूंकि क्रैश एक के दौरान हुआ था git push, यह स्पष्ट रूप से क्लाइंट साइड पर फिर से लिखना के दौरान हुआ था जो सर्वर अपडेट होने के बाद होता है। मैंने चारों ओर देखा और पता लगा कि c2388मेरे मामले में एक प्रतिबद्ध वस्तु थी, क्योंकि इसे प्रविष्टियों द्वारा संदर्भित किया गया था .git/refs। इसलिए मुझे पता था कि c2388जब मैं इतिहास (एक वेब इंटरफेस या दूसरे क्लोन के माध्यम से) को देख पाऊंगा तो मुझे पता चलेगा ।

दूसरे क्लोन पर मैंने git log -n 2 c2388पूर्ववर्ती के पहचान के लिए एक किया c2388। फिर मैंने मैन्युअल रूप से संशोधित किया .git/refs/heads/masterऔर इसके बजाय .git/refs/remotes/origin/masterपूर्ववर्ती होना चाहिए । तब मैं ए । खाली वस्तुओं पर संघर्ष के लिए कई बार असफल रहा। मैंने इनमें से प्रत्येक खाली वस्तु को तब तक हटाया जब तक कि सफल नहीं हो गया। इसने भंडार को ठीक कर दिया है।c2388c2388git fetchgit fetchgit fetch


1

मैंने इस तरह से हल किया: मैंने बैकअप की क्लोन से अनियंत्रित ऑब्जेक्ट फ़ाइल को अपने मूल भंडार में कॉपी करने का निर्णय लिया। यह भी काम किया। (वैसे: यदि आप अपने नाम से .गित / ऑब्जेक्ट्स / ऑब्जेक्ट को नहीं ढूंढ सकते हैं, तो संभवतः यह अंतरिक्ष को संरक्षित करने के लिए [पैक] [पैक] किया गया है।)


0

मुझे अपने नंगे दूरस्थ गिट रेपो में भी यही समस्या थी। बहुत समस्या निवारण के बाद, मुझे पता चला कि मेरे एक सहकर्मी ने एक कमिट किया था, जिसमें .git / ऑब्जेक्ट्स में 444 (r - r - r) के बजाय 440 (r - r -----) की अनुमति थी। -)। सहकर्मी को नंगे गिट रेपो के अंदर "चामॉड 444 -R ऑब्जेक्ट" के साथ अनुमतियों को बदलने के लिए कहने के बाद, समस्या तय हो गई थी।


0

मुझे बस इस तरह की समस्या थी। मेरी विशेष समस्या एक सिस्टम क्रैश के कारण हुई, जिसने सबसे हालिया प्रतिबद्ध (और इसलिए मास्टर शाखा) को भी दूषित कर दिया। मैंने धक्का नहीं दिया था, और फिर से कमिट करना चाहता था। मेरे विशेष मामले में, मैं इस तरह से निपटने में सक्षम था:

  1. का बैकअप बनाएं .git/:rsync -a .git/ git-bak/
  2. .git/logs/HEADवैध कमिट आईडी के साथ अंतिम पंक्ति की जाँच करें और खोजें। मेरे लिए, यह दूसरी सबसे हाल की प्रतिबद्धता थी। यह अच्छा था, क्योंकि मेरे पास अभी भी फ़ाइल के काम करने वाले निर्देशिका संस्करण थे, और इसलिए हर संस्करण जो मुझे चाहिए था।
  3. उस वचन पर एक शाखा बनाएं: git branch temp <commit-id>
  4. कार्यशील निर्देशिका में फ़ाइलों के साथ टूटी हुई प्रतिबद्धताओं को फिर से करें।
  5. git reset master temp चरण 2 में आपके द्वारा बनाई गई नई शाखा में मास्टर शाखा को स्थानांतरित करने के लिए।
  6. git checkout masterऔर जांचें कि यह सही दिखता है git log
  7. git branch -d temp
  8. git fsck --full, और यह अब किसी भी भ्रष्ट वस्तुओं को हटाने के लिए सुरक्षित होना चाहिए जो fsck पाता है।
  9. यदि यह सब अच्छा लगता है, तो धक्का देने का प्रयास करें। अगर वह काम करता है,

मेरे लिए वह काम कर गया। मुझे संदेह है कि यह एक सामान्य रूप से सामान्य परिदृश्य है, क्योंकि सबसे हालिया प्रतिबद्ध सबसे भ्रष्ट होने की सबसे अधिक संभावना है, लेकिन यदि आप एक और वापस खो देते हैं, तो आप शायद इस तरह की विधि का उपयोग कर सकते हैं, सावधानीपूर्वक उपयोग git cherrypickऔर फिर से भरना में है .git/logs/HEAD


0

जब मेरे पास यह मुद्दा था तो मैंने अपने हाल के बदलावों का समर्थन किया (जैसा कि मुझे पता था कि मैंने क्या बदल दिया है) तो उस फ़ाइल को हटा दिया गया था जो कि .OG / स्थान के बारे में शिकायत कर रही थी। फिर मैंने एक गिट्ट खींची। हालांकि ध्यान रखें, यह आपके लिए काम नहीं कर सकता है।


0

एक बार मेरा सिस्टम क्रैश होने के बाद मैंने इसका सामना किया। मैंने क्या किया है:

(कृपया ध्यान दें कि आपके भ्रष्ट कमिट खो गए हैं, लेकिन परिवर्तन बरकरार हैं। आपको इस प्रक्रिया के अंत में उन कमिटों को फिर से बनाना होगा)

  • अपने कोड का बैकअप लें।
  • अपनी कार्यशील निर्देशिका पर जाएं और .gitफ़ोल्डर हटाएं ।
  • अब रिमोट को किसी अन्य स्थान पर क्लोन करें और .gitउसमें फ़ोल्डर कॉपी करें ।
  • इसे अपनी कार्यशील निर्देशिका में चिपकाएँ।
  • कमिटमेंट जैसा आप चाहते थे।

-7

बस .it फ़ोल्डर को हटा दें और इसे फिर से जोड़ें। इस सरल समाधान ने मेरे लिए काम किया।


3
यह आपके स्थानीय रिपॉजिटरी को बनाएगा ..., इसके बजाय अवांछित दुष्प्रभाव हो सकते हैं :) कृपया अपना प्रस्ताव संपादित करें और उस चेतावनी को जोड़ें।
फेलिक्स

1
यदि आप हटाए गए .git, और क्लोन किए गए प्रोजेक्ट से कॉपी करते हैं, तो रेपो काम करेगा, लेकिन कोई स्थानीय शाखाएं, और न ही स्टैम्स संरक्षित नहीं किए जाएंगे। साथ ही, एक अनुकूल सुझाव, डाउन-वोट प्राप्त करने को रोकने के लिए अपने उत्तर को पूरी तरह से हटा दें।
व्लादिमीर वुकानैक

1
whoa नेल्ली ... एक चिमटी नौकरी के लिए एक bazooka का उपयोग करने के बारे में बात करते हैं।
ट्यूनके गोनकुओलू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.