Git रिपॉजिटरी में एकाधिक हटाए गए फ़ाइलों को कैसे निकालें


236

मैंने नीचे कुछ फ़ाइलें और गिट स्थिति शो को हटा दिया है।

मैंने प्रतिबद्ध और धक्का दिया है।

GitHub अभी भी रिपॉजिटरी में हटाई गई फ़ाइलों को दिखाता है। मैं GitHub रिपॉजिटरी में फ़ाइलों को कैसे हटा सकता हूं?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

यदि मैं उपयोग करता हूं git rm, तो यह निम्नलिखित है।

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched

की संभावित डुप्लिकेट: stackoverflow.com/questions/1402776/… stackoverflow.com/questions/492558/…
toto_tico

जवाबों:


637
git add -u 

आपके सभी परिवर्तनों को अपडेट करता है


31
एक आकर्षण काम करता है। जब आप "git स्टेटस | सेड-एन '/ ^ # * डिलीट: / s /// p'। Xargs git rm" जैसी कोई चीज़ देखते हैं तो ऐसे सरल लेकिन लगातार आवश्यकता के लिए प्रस्तावित समाधान के रूप में तो आप एक बेहतर समाधान जानते हैं, या जल्द ही, कोने के आसपास होगा।
आर्केल्डन

सरल बेहतर है, यह वास्तव में आसान है तो "बैश" रास्ता
कास्टियल

1
लेखक पूछता है कि फ़ाइलों को कैसे हटाया जाए, फाइलों को जोड़ना सही उत्तर क्यों है?
kelin

3
@kelin: git डॉक्स ( git-scm.com/docs/git-add ) से: "-u --update इंडेक्स को अपडेट करें जहां यह पहले से ही एक एंट्री मैच कर रहा है <pathspec>। यह हटाता है और साथ ही इंडेक्स एंट्रीज को भी संशोधित करता है। वर्किंग ट्री से मेल खाते हैं, लेकिन कोई नई फाइल नहीं जोड़ता है। यदि कोई विकल्प नहीं दिया जाता है, जब -u विकल्प का उपयोग किया जाता है, तो पूरे वर्किंग ट्री में सभी ट्रैक की गई फ़ाइलों को अपडेट किया जाता है (Git के पुराने संस्करण वर्तमान निर्देशिका में अपडेट को सीमित करने के लिए उपयोग किए जाते हैं और इसकी उपनिर्देशिकाएँ) ”।
HEDMON

92

के बारे में बहुत सतर्क रहें git rm .; आप जितना चाहें उससे अधिक निकाल सकते हैं। बेशक, आप ठीक हो सकते हैं, लेकिन ऐसा करना आसान नहीं है।

सबसे सरल होगा:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

आप शेल वाइल्डकार्ड का उपयोग नहीं कर सकते क्योंकि फाइलें मौजूद नहीं हैं, लेकिन आप उपयोग कर सकते हैं (कम से कम बाश में):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

या विचार करें:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

यह आउटपुट लेता है git status, डिफ़ॉल्ट रूप से कुछ भी प्रिंट नहीं करता है ( sed -n), लेकिन शुरू होने वाली लाइनों पर # deleted:, यह छुटकारा पाता है #और deleted:और छोड़ दिया गया प्रिंट करता है; xargsतर्कों को इकट्ठा करता है और उन्हें एक git rmकमांड प्रदान करता है । यह नामों में समानता (या असमानता) की परवाह किए बिना किसी भी संख्या के लिए काम करता है।


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

109
git diff --diff-filter=D --name-only -z | xargs -0 git rmपार्स करने की कोशिश करने से अधिक विश्वसनीय दृष्टिकोण है git statusजो उपयोगकर्ता उन्मुख है और भविष्य के संस्करणों पर स्थिर होने की गारंटी नहीं है।
सीबी बेली

@Charles: यह निश्चित रूप से बेहतर है, लेकिन इसके बारे में काफी ज्ञान की आवश्यकता है कि कौन से विकल्प उपलब्ध हैं git diff(जो मेरे पास नहीं थे, पहले की आवश्यकता नहीं थी)। धन्यवाद!
जोनाथन लेफ़लर

8
ध्यान दें कि "git ls-files --deleted" भी है
पेट्र

1
तो, git ls-files --deleted | xargs git rmमेरे लिए चाल चली गई।
फियाकोबेली

50

एक और संस्करण ByScripts उत्तर है

git rm $(git ls-files --deleted)

यह केवल हटाए गए फ़ाइलों को गिट से हटा देगा।

इसका उपयोग केवल संशोधित फ़ाइलों को भी जोड़ने के लिए किया जा सकता है।

git add $(git ls-files --modified)

ये कमांड विंडो के लिए gitbash पर भी काम करती है।


2
अनमोल, git ls-filesहटाए गए या संशोधित स्थिति के साथ इतना मददगार है।
मारियो पैशेव

1
'git add --update (or -u)'पेड़ की एक उपनिर्देशिका से कोई रास्ता तर्क के साथ व्यवहार जीआईटी 2.0 में बदल जाएगा और अब इसका उपयोग नहीं किया जाना चाहिए। संपूर्ण ट्री के लिए सामग्री जोड़ने के लिए, चलाएं: git add --update :/ (या git add -u: /) कमांड को वर्तमान निर्देशिका में प्रतिबंधित करने के लिए, चलाएँ: git add --update . (या git add -u।) वर्तमान Git संस्करण के साथ, कमांड प्रतिबंधित है। वर्तमान निर्देशिका
Ans

1
किसी भी विचार कैसे उन में रिक्त स्थान के साथ पथ को संभालने के लिए? उदाहरण: src/my spaced directory/myfile। इसे व्यक्तिगत रूप से नियंत्रित किया जा सकता है लेकिन इस उत्तर में आदेशों का उपयोग करके इसे कैसे संभाला जा सकता है?
मुहम्मद गेलबाना

35

आपके द्वारा किए गए सभी परिवर्तनों को अपडेट करें:

git add -u

हटाई गई फ़ाइलें अस्थिर (आमतौर पर लाल रंग) से चरणबद्ध (हरे) में बदलनी चाहिए। फिर हटाई गई फ़ाइलों को हटाने के लिए प्रतिबद्ध:

git commit -m "note"

1
लोकलुभावन बिल्ला का वर्णन करता है।
जॉन

1
यह अब तक का सबसे अच्छा समाधान है। कोई स्क्रिप्टिंग हैक नहीं, कोई लंबी प्रक्रिया नहीं, बस एक झंडे को अपने सूचकांक को अच्छी तरह से अपडेट करने के लिए बताने के लिए।
रॉन डाहलग्रेन

प्रतिभाशाली! मुझे 20+ फ़ाइल पथ टाइप करने से बचाया। धन्यवाद!

12

यदि आप संशोधित फ़ाइलों के बारे में परवाह नहीं करते हैं तो सबसे अच्छा समाधान है, git add -uजैसा कि mshameers और / या द्वारा कहा गया है pb2q

यदि आप केवल हटाई गई फ़ाइलों को निकालना चाहते हैं, लेकिन किसी भी संशोधित चरण को नहीं, मुझे लगता है कि आपको विकल्प के ls-filesसाथ तर्क का उपयोग करना चाहिए --deleted(regex या अन्य जटिल args / विकल्प का उपयोग करने की आवश्यकता नहीं है):

git ls-files --deleted | xargs git rm

1
git add -Aइस मुद्दे को हल करता है ... बस अगर कोई भविष्य में जानना चाहता है। नीचे दिए गए जवाब की जाँच करें
Ja8zyjits

8

हां, git rm <filename>एक फ़ाइल की हटाई गई अवस्था को चरणबद्ध करेगा, जहां <filename>एक ग्लोब पैटर्न हो सकता है:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

फिर, आप कर सकते हैं।

git commit -a यदि आप चाहें तो एक बार में ऐसा कर सकते हैं।

आप git add -uसभी हटाए गए फ़ाइलों सहित सभी परिवर्तनों को चरणबद्ध करने के लिए भी उपयोग कर सकते हैं , फिर प्रतिबद्ध कर सकते हैं।


इतना आर.एम. (पूर्ण विराम) उन्हें एक बार में हटा दें?
पिंडली

तो बस git rm एक ही बार में सभी को हटा देगा?
पिंडली

1
आप कई फ़ाइलों को हटाने के लिए एक ग्लोब-शैली पैटर्न का उपयोग कर सकते हैं; मैंने एक उदाहरण दिखाने के लिए अपना उत्तर अपडेट किया।
बेन जेम्स

5
ऐसा लगता git add -uहै कि वास्तव में हम क्या खोज रहे हैं - यदि आप कई विलोपन करते हैं, तो सभी विलोपन करना चाहते हैं, जो सबसे आसान और सबसे 'मानक' तरीका प्रतीत होता है (मतलब, बिना केस-विशिष्ट ग्लब्स या जटिल शेल पार्सिंग में xargs)। क्या कोई कारण है कि हम इसका उपयोग नहीं करना चाहते, इस तथ्य के अलावा कि यह एक ही बार में सभी परिवर्तनों को जोड़ता है?
trisweb

7

जब मेरे पास बहुत सारी फाइलें होती हैं, जिन्हें मैं कमिटेड के लिए अनस्ट्रेड कर देता हूं, तो आप git rmउन सभी के साथ एक शो में कर सकते हैं:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

जैसा कि प्रश्न उत्तर देने वाले ने उल्लेख किया है, सावधान रहें git rm


5

इसे इस्तेमाल करे:

 git rm `git ls-files -d`

इसने केवल हटाए गए स्क्रिप्ट्स (बैश का उपयोग करके) के मंचन की मेरी समस्या को हल किया
Mariano Argañaraz

3

आप उपयोग कर सकते हैं

git commit -m "remove files" -a
git push

आपके द्वारा फ़ाइलों को मैन्युअल रूप से हटाने के बाद।


1
या जान-बूझकर लेकिन अधिक आसानी से: जीआईटी कमिटम "फाइल्स हटाएं"
ब्रैडकिसने79

3

आप एक शेल स्क्रिप्ट बना सकते हैं जो चलने पर आपकी सभी फ़ाइलों को हटा देगी:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

जो स्क्रिप्ट बनाई गई है, remove.shवह है और इसमें git rmकमांड्स की पूरी सूची है ।




2

यदि आप "git rm" का उपयोग करके उन सभी को हटाना चाहते हैं। मैं यह करता हूं:

git ls-files --deleted -z | xargs -0 git rm

यह क्वेरी उन सभी फ़ाइलों की सूची बनाती है जिन्हें हटा दिया गया है और उन्हें आपके गिट रिपॉजिटरी से हटा देता है। आशा करता हूँ की ये काम करेगा।



1

मेरे पास उनके हटाए जाने के बाद मेरे रेपो में दिखाई देने वाली भूत फ़ाइलों का यह मुद्दा था और इस साफ-सुथरी कमान में आया था!

git add -A

यह अनिवार्य रूप से समान git add -aऔर git add -uसंयुक्त है, लेकिन यह संवेदनशील है। मुझे यह इस भयानक लिंक से मिला (यह लिंक अब आर्काइव.ऑर्ग पर संस्करण की ओर इंगित करता है, क्योंकि मूल जून 2016 तक स्पैम / फ़िशिंग पृष्ठ में बदल गया है)


0

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

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

निम्नलिखित के साथ चलने से पहले यह सुनिश्चित कर लें कि आप इसे git के -dry-run विकल्प के साथ परखें:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

स्पष्टीकरण:

git status --porcelain

यह डी जैसे कुछ को प्रिंट करता है "/ एक फ़ोल्डर / पथ को एक फ़ाइल के लिए पथ" जो केवल तब होता है जब पथ नामों में स्थान होते हैं

awk '/^.D .*$/ {print $0}'

केवल "D" से शुरू होने वाली रेखाओं का मिलान करें

sed 's/ D \(.*\)/\1/'

प्रत्येक स्ट्रिंग के सामने से "D" निकालें

tr -d '"'

उद्धरण निकालें, यदि कोई हो

xargs -I {} git rm '{}'

फ़ाइल नाम वेरिएबल्स को {} रन फ़ाइल नाम के रूप में परिभाषित करें, जो एकल उद्धरणों में संलग्न है, ताकि यह सुनिश्चित हो सके कि यह रिक्त स्थान के लिए फ़ाइल नाम का समर्थन करता है।

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