git rm - घातक: pathspec किसी भी फाइल से मेल नहीं खाता


87

मैंने अपने प्रोजेक्ट फ़ोल्डर में दुर्घटना से 9000 से अधिक तस्वीरें जोड़ीं। और उन्हें प्रतिबद्ध किया। फिर उन्हें डिस्क से हटा दिया। प्रतिबद्ध।

अब मैं परिवर्तन सर्वर को बदलने के लिए प्रयास करें। लेकिन इसमें बहुत अधिक समय लगता है और 12 Gb डेटा भेजने की कोशिश करता है।

मैंने डिस्क पर फ़ाइलों का आकार चेक किया और देखा कि वास्तव में .gitफ़ोल्डर 12 जीबी लेता है।

वहां से फोटो कैसे डिलीट करें ? मैंने कोशिश की git rm, लेकिन असफल रहा:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

क्योंकि मैंने पहले ही उन्हें डिस्क से हटा दिया था, लेकिन वे अभी भी .gitफ़ोल्डर में हैं।

मैं जोड़ने की कोशिश की public/photosकरने के लिए .gitignore:

public/photos/
*.zip

लेकिन कोई नतीजा नहीं निकला। निश्चित रूप से मैं उस hard reset headक्षण को पा सकता हूं जब मेरे प्रोजेक्ट में इतनी सारी रद्दी तस्वीरें नहीं थीं। लेकिन उस समय से मैंने कई बार प्रतिबद्ध किया और कोड में बहुत बदलाव किए।

जवाबों:


86

अपने मामले में, के git filter-branchबजाय का उपयोग करें git rm

git rm फ़ाइलों को इस अर्थ में हटा देगा कि उन्हें अब गिट द्वारा ट्रैक नहीं किया जाएगा, लेकिन यह उन छवियों के अनुरूप पुरानी प्रतिबद्ध वस्तुओं को नहीं हटाता है, और इसलिए आप अभी भी पहले के कमिट को धक्का देने के साथ फंस जाएंगे जो 12GB छवियों के अनुरूप हैं।

git filter-branchदूसरी ओर, उन फ़ाइलों को सभी पिछले प्रतिबद्ध से और साथ निकाल सकते हैं, इस प्रकार उनमें से किसी को पुश करने के लिए की आवश्यकता के साथ दूर कर रही है।

  1. कमांड का उपयोग करें

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. फ़िल्टर शाखा के पूर्ण होने के बाद, सत्यापित करें कि कोई अनजानी फ़ाइल गुम नहीं हुई थी।

  3. अब एक .gitignore नियम जोड़ें

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. अब एक धक्का दो

    git push -f origin branch
    

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

आपके ओरिजिनल एरर मैसेज के लिए, यह इसलिए हो रहा है क्योंकि आपने पहले से ही इन्हें यूज कर अनट्रैक कर दिया है git rm, और इसलिए git को शिकायत है क्योंकि यह ऐसी फाइल को नहीं हटा सकता है जो इसे ट्रैक नहीं कर रही है। इसके बारे में यहाँ और पढ़ें ।


2
हे, मैं एक ही समस्या के साथ हूँ, लेकिन जब चरण 1 पर कमांड टाइप करते हैं, तो मुझे एक त्रुटि मिलती है: घातक: बुरा संशोधन '--prune-blank'। कोई सुराग?
केविन

@kevin क्षमा करें, इस टिप्पणी से चूक गए। आप इसे उस झंडे के बिना चला सकते हैं। प्रूनिंग किसी भी खाली वस्तु को हटा देती थी।
मू m

1
नहीं इस लाइन चाहिए git add .gitignore && commit -m "ignore rule for photos"होनाgit add .gitignore && git commit -m "ignore rule for photos"
क्लोन

@Clone हाँ, यह होना चाहिए, अब इसे सही कर लिया है :)
mu

1
यह एक बहुत ही भयानक जवाब है। एक मुद्दा मैंने कई वर्षों से अपने रेपो के साथ रखा है। धन्यवाद!
मोशे

18

बहुत ही सरल उत्तर है।

चरण 1:

सबसे पहले अपनी अनट्रैक की गई फ़ाइलों को जोड़ें, जिन्हें आप हटाना चाहते हैं:

का उपयोग कर git add .या git add <filename>

चरण 2:

फिर उन्हें आसानी से git rm -f <filename>यहाँ rm = remove और -f = forcely कमांड का उपयोग करके हटाएं।


यह वह नहीं करेगा जो ओपी चाहता है, जो उन फ़ाइलों को हटाने के लिए है जो पिछले कमिट में मौजूद हैं। आपको git filter-branchअन्यत्र बताए अनुसार उपयोग करने की आवश्यकता है।
साइमन स्टीवंस

9

चरण 1

अपनी फ़ाइल में फ़ाइल का नाम जोड़ें .gitignore

चरण 2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

चरण 3

git push -f origin branch

@Mu को बहुत-बहुत धन्यवाद।


7
... मैंने हमेशा सोचा था कि यह कठिन था जितना कि यह होना चाहिए यह साबित होता है। कोई रास्ता नहीं है किसी को भी याद नहीं कर सकते हैं अधिकांश git कमांड के अस्तित्व को अकेले उनके झंडे और quirks। गिट मॉडल समझ में आता है, और यह तब तक काम करता है जब तक आप सरल प्रवाह का पालन नहीं करते हैं, और जैसे ही आप फंस जाते हैं, आप मुश्किल से फंस जाते हैं।
मुहम्मद उमर

2
यह वह समाधान है जो मेरे लिए काम करता है, मुझे जरूरत है--ignore-unmatch
गुहुर


1

यह श्रृंखला मेरे मामले में काम करती है:

  1. git rm -r WebApplication/packages

पुष्टि-संवाद था। आपको "y" विकल्प चुनना चाहिए।

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

काम किया, यह उन फ़ाइलों को पुनर्स्थापित करता है जिन्हें मैंने उपयोग rmकरने के बजाय हटा दिया था git rm

मैंने आखिरी हैश का पहला चेकआउट किया था, लेकिन मुझे नहीं लगता कि इसकी आवश्यकता है।


0

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

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

फिर, आपको इसे अपने में जोड़ने की आवश्यकता है .gitignoreताकि इसे आगे ट्रैक न किया जा सके।


-1

मेरे पास एक डुप्लिकेट निर्देशिका (~ वेब / वेब) थी और जब मैंने rm -rf webपहले वेब फ़ोल्डर के अंदर भाग लिया था , तो इसने नेस्टेड डुप्लिकेट को हटा दिया था ।


माफ़ करना! मुझे प्रश्न को गलत समझना चाहिए। मैंने सोचा था कि लक्ष्य क्या था
ccsinsf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.