2012-06-07 10 views
7

मैं कुछ लाइन-एंडिंग समस्याओं के साथ संघर्ष कर रहा हूं, लगभग 20 काम करता है और कुछ अजीब चीजें होती हैं। अब ऍफ़एससीके शो git:गिट पेड़ में डुप्लिकेट फ़ाइल प्रविष्टियां

Checking object directories 100% (256/256), done. 
error in tree ee2060e71cb36d33be5ddc1fe9ca8d7dd0ab35cd: contains duplicate file entries 
Checking objects: 100% (8633/8633), done. 

और Git शो ee2060 पता चलता है:

File1.cs 
File2.cs 
File2.cs 
File2.cs 
File3.cs 

यह मेरा रिमोट को आगे बढ़ाने से मुझे रोक रहा है। गिट पुश शो:

error: unpack failed: index-pack abnormal exit 
To https://github.com/username/Project.git 
! [remote rejected] master -> master (n/a (unpacker error)) 
error: failed to push some refs to 'https://github.com/username/Project.git' 

मैंने मरम्मत और कचरा इकट्ठा करने की कोशिश की है। मैं यह मुश्किल कैसे सुलझाऊँ?

उत्तर

4

मैं अंत में कर निम्नलिखित

  1. GitHub, जो केवल करता शामिल समस्या से पहले
  2. पर रिमोट के रूप में फाइल सिस्टम से मेरे में गड़बड़ रेपो जोड़ने हुआ से एक ताजा क्लोन कर द्वारा रेपो तय नई क्लोन
  3. बड़ी मेहनत की जाँच नए क्लोन

    git checkout fe3254FIRSTCOMMITAFTERORIGIN/MASTER/HEAD . // note the dot at the end 
    // without the dot, you move your head to the commit instead of the commit 
    // to the working copy, and seems to bring the corrupt object into your good clone 
    
  4. commi का काम कर कॉपी में बुरा रेपो से करता है टी प्रत्येक बारी में, मैन्युअल रूप से कॉपी करने अन्य रेपो से संदेश प्रतिबद्ध
  5. रिमोट से भ्रष्ट रेपो
  6. कचरा हटाने इकट्ठा + छँटाई

    git gc --aggressive --prune=now 
    
  7. रो खुशी के रूप में Git ऍफ़एससीके कोई डुप्लिकेट फ़ाइल प्रविष्टियों से पता चलता
+0

सुझाव क्यों - आक्रामक? एकमात्र चीज यह है कि पिछले सभी एकत्रित डेल्टा जानकारी को अनदेखा कर रहा है। अधिक जानकारी: http://metalinguist.wordpress.com/2007/12/06/the-woes-of-git-gc-aggressive-and-how-git-deltas-work/ – riezebosch

+0

@riezebosch मुझे याद नहीं है क्यों मैंने शामिल किया - आक्रामक या समस्या को ठीक करने के लिए आवश्यक था या नहीं। –

+1

ठीक है, मैं कल्पना कर सकता हूं कि लटकती हुई चीजों से छुटकारा पाने के लिए सभी डेल्टा को पूरी तरह से पुनर्निर्माण करने की आवश्यकता है। – riezebosch

0

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

वैसे, git ls-tree ee2060 आपको क्षतिग्रस्त पेड़ में मौजूद डेटा के बारे में अधिक जानकारी दिखाना चाहिए, जैसे कि संदर्भित फाइलें।

1

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

+0

ठीक है, मैंने समस्या से पहले जांच की है और चेरी ने खराब कामों को छोड़कर, और नई शाखा में मास्टर को रीसेट करने के क्रम में काम किया है। हालांकि, गिट एफएसके अभी भी डुप्लिकेट प्रविष्टियों को दिखाता है, मैं सबकुछ कोशिश करने के बाद भी सोच सकता हूं कि मैं छंटनी को मजबूर करने के बारे में सोच सकता हूं, आदि एक सैनिटी चेक के रूप में, मैंने समस्या से पहले जांच की और उसके बाद सभी कामों को हटा दिया। समस्या अब भी वहीं है। इसलिए मैंने बुरे पेड़ को खोजने के लिए बार-बार पेड़ की खोज करने के लिए एक बैश स्क्रिप्ट लिखी, और इसका उल्लेख किसी भी द्वारा नहीं किया गया है। क्या ग्रिट को अनियंत्रित वस्तुओं को छीनने का कोई तरीका है जिसे मैं नहीं जानता? –

+0

जब तक आपके पास बुरे कामों का कोई संदर्भ नहीं है, तो आप उन्हें चले जाएंगे। एक बार 'git gc --aggressive --prune = now' करें जब आपके संदर्भों को रिफ्लॉग के कारण क्रमबद्ध किया जाता है, अब उन्हें कैशिंग नहीं किया जाता है। –

6

मैंने अतीत में इसे ठीक करने के लिए गिट-प्रतिस्थापन और गिट-मैक्टी का उपयोग किया। आप अनिवार्य रूप से टूटी हुई पेड़ वस्तु को रखते हैं, लेकिन सभी लिंक ओवरराइड करते हैं और उन्हें एक नई वस्तु को इंगित करते हैं।

  1. पहले हम बुरा पेड़ हड़पने: git ls-tree bad_tree_hash > tmpfile.txt यह आपके बुरा पेड़ बाहर लिखता है।उदाहरण के लिए:

    040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 → xNotAlphabetic 
    040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb → EXT 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 → ToolTester 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    

    एनबी, · & → खाली स्थान के [अंतरिक्ष] और [टैब]

  2. इसके बाद, पाठ संपादित करके उल्लंघन लाइनों को हटाने, और यूनिक्स शैली अंत के साथ बचाने (हैं यानी केवल एलएफ, सीआरएलएफ नहीं)।

    040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb → EXT 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 → ToolTester 
    040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 → xNotAlphabetic 
    
  3. प्रकार cat tmpfile.txt | git mktree जो एक नया, फिक्स्ड पेड़ वस्तु करें और उन्हें सहेजें, और नए हैश वापस आ जाएगी: इस उदाहरण के साथ, हम इस बनाने के डेमो उद्देश्यों के लिए उर्फ ​​ a55115e4a05ea9ac8b79e37b872024d64d4r2c2enew_tree_hash

  4. अगला गिट प्रतिस्थापन एक नया संदर्भ तैयार करेगा, जो सभी पूर्व घटना लिंक को इसके बजाय नई, निश्चित वस्तु का उपयोग करने के लिए मजबूर करता है। git replace bad_tree_hash new_tree_hash

यह अपने तत्काल समस्या का समाधान होगा। यदि आप रुचि रखते हैं, तो .git/refs/replace फ़ोल्डर में ओवरराइडिंग लिंक देखें।


बुरा पेड़ वस्तु चेतावनी उत्पन्न करने के लिए जब भी आप git fsck के साथ अपने भंडार पर नियंत्रण करना जारी रहेगा, लेकिन इसे अनदेखा किया जा सकता है, और अपने सभी प्रतिबद्ध और अन्य लिंक सुसंगत और परवाह किए बिना काम कर रहे हो जाएगा।

1

मुझे इस तरह की समस्या थी और यहां सभी समाधान और अन्य एसओ धागे मेरे लिए इसे ठीक करने में विफल रहे। अंत में मैंने BFG repo cleaner का उपयोग उन सभी कामों को नष्ट करने के लिए किया जो खराब फ़ोल्डर नाम का संदर्भ देते हैं, जो संभवतः ओवरकिल था लेकिन सफलतापूर्वक रिपो की मरम्मत की गई थी।

संबंधित मुद्दे