स्थानीय फ़ाइल सिस्टम से हटाए बिना किसी फ़ाइल रिपॉजिटरी से एक फ़ाइल निकालें


3042

मेरी प्रारंभिक प्रतिबद्ध में कुछ लॉग फाइलें थीं। मैंने अपने साथ जोड़ा *logहै .gitignore, और अब मैं अपनी रिपॉजिटरी से लॉग फ़ाइलों को हटाना चाहता हूं।

git rm mylogfile.log

रिपॉजिटरी से एक फ़ाइल को हटा देगा, लेकिन इसे स्थानीय फ़ाइल सिस्टम से भी हटा देगा।

मैं अपनी फ़ाइल की स्थानीय प्रतिलिपि को हटाए बिना इस फ़ाइल को रेपो से कैसे निकाल सकता हूँ ?



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

जवाबों:


4346

से आदमी फ़ाइल :

जब --cachedदिया जाता है, तो मंचित सामग्री को या तो शाखा की नोक या डिस्क पर फ़ाइल से मेल खाना पड़ता है, जिससे फ़ाइल को केवल सूचकांक से हटाया जा सकता है।

तो, एक फ़ाइल के लिए:

git rm --cached mylogfile.log

और एकल निर्देशिका के लिए:

git rm --cached -r mydirectory

150
आसानी से याद किया क्योंकि यह स्वयं व्याख्यात्मक नहीं है svn rm --keep-local
मार्टिन

114
लेकिन मैं दूरस्थ सर्वर पर फ़ाइलों को कैसे संरक्षित करूं? यह मेरा लोकल रखता है, लेकिन अगर मैं किसी दूसरे सर्वर से पुश और पुल करता हूं, तो फाइल डिलीट हो जाती है। मैंने फ़ाइल के लिए एक .gitignore भी जोड़ा है, लेकिन यह अभी भी हटा दिया गया है
spankmaster79

6
इसके बाद भी git pullयदि आप कमिट के पीछे हैं, तो फाइल हटा देता हैgit rm
पेट्र पेलर

9
ध्यान देने योग्य बात यह है कि, उत्तर में कमांड चलाने के बाद, आपको उपयोग करने की आवश्यकता है git commit -m "Commit message"और git push। यदि आपके पास कोई अन्य चरणबद्ध परिवर्तन (चेक के साथ git status) हैं, तो वे इस समय भी प्रतिबद्ध होंगे।
सिंजई

9
चूंकि यह सबसे स्वीकृत उत्तर है और ऐसा नहीं करता है, इसलिए इसके लिए क्या पूछा जाता है, मैं बताता हूं कि मैं क्या करता हूं। मैं कमांड का उपयोग करता हूं git rm --cached mylogfile.logऔर रिपॉजिटरी से फाइल को डिलीट करता हूं । उत्पादक प्रणाली पर फ़ाइल खोने से बचने के लिए मैं फ़ाइल का बैकअप बनाता हूं और इसके बाद खींचता हूं। फ़ाइल को पहले बताए अनुसार हटा दिया गया है और अपने बैकअप से वापस कॉपी करने की आवश्यकता है। यह काफी दर्द भरा है, लेकिन मुझे इस समस्या का कोई बेहतर समाधान नहीं मिला।
मार्सेल ग्रॉम्स

275

रेपो से एक संपूर्ण फ़ोल्डर को हटाने के लिए (जैसे कि रिसर्पर फाइलें), यह करें:

git rm -r --cached folderName

मैंने कुछ रीशैपर फ़ाइलों को किया था, और नहीं चाहता था कि वे अन्य प्रोजेक्ट उपयोगकर्ताओं के लिए बने रहें।


13
भविष्य के आगंतुकों के लिए बस एक जोड़ा गया नोट: रेपो को वापस करने के लिए "सिंक" करने के लिए GUI का उपयोग न करें। यह आपके स्थानीय रेपो में फ़ाइलों को नीचे खींच देगा। आपको Git Push repo branchवास्तव में फ़ाइलों को दूरस्थ से निकालने के लिए करना होगा ।
रबरडुक

211

आप स्थानीय फ़ाइल सिस्टम से हटाने के बिना अपने .gitignore के आधार पर भंडार से फ़ाइलों को भी हटा सकते हैं:

git rm --cached `git ls-files -i -X .gitignore`

या, वैकल्पिक रूप से, विंडोज पॉवर्सशेल पर:

git rm --cached $(git ls-files -i -X .gitignore)

7
विंडोज पर काम नहीं करता है। git ls-files -i -X ​​.gitignore काम करता है, लेकिन मुझे नहीं पता कि फाइलों को 'git rm' में कैसे भेजा जाए। क्या आप जानते हैं कि वह काम कैसे करना है?
एरिक जेड

17
विंडोज पर काम करता है अगर आप cmd-कंसोल के बजाय Git Bash का उपयोग करते हैं
Andreas Zita

17
इसे प्रेम करें। इसके अलावा काम किया है कि मेरे पास कुछ फाइलें थीं जो फाइलनाम में रिक्त स्थान थीं। मैं इस के लिए यहाँ समाधान संशोधित: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}"। कृपया इस समाधान को उत्तर में जोड़ने या संशोधित करने पर विचार करें, क्योंकि यह एक महान उपकरण है ...
एमपीटीसिस

मैंने कोशिश नहीं की, लेकिन यह परीक्षण किया जाना चाहिए कि क्या यह उन फाइलों को भी हटा देगा, .gitkeepजो भंडार में एक खाली फ़ोल्डर को संरक्षित करता है। उदाहरण के लिए। .gitignoreफ़ोल्डर uploadsऔर रेपो को ट्रैक करने के लिए मजबूर किया जाता है .gitkeep। इसके तहत रेपो से सभी uploadsको हटाकर भी हटा देगा .gitkeep
व्लादिमीर वुकानैक

यह सुझाव पूरी तरह से कार्य करने में सक्षम था: git rm - कैशेड $ (git ls-files -i -X
.ignignore

89

मेरे उत्तर के अनुसार यहाँ: /programming/6313126/how-to-remove-a-directory-in-my-github-repository

फ़ोल्डर / निर्देशिका या फ़ाइल को केवल गिट रिपॉजिटरी से हटाने के लिए और स्थानीय से नहीं 3 सरल चरणों का प्रयास करें।


निर्देशिका को हटाने के लिए कदम

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

अगले फ़ोल्डर में उस फ़ोल्डर को अनदेखा करने के लिए कदम

अगले कमिट से उस फोल्डर को अनदेखा करने के लिए .itignore नाम की एक फाइल रूट करें और उस फोल्डर का नाम उसमें डालें। आप जितना चाहे उतना डाल सकते हैं

.gitignore फ़ाइल इस तरह दिखाई देगी

/FolderName

निर्देशिका निकालें


@ गौरव को इससे मदद मिली!
एरिनयोस

69

इसके अलावा, यदि आपने संवेदनशील डेटा (उदाहरण के लिए एक पासवर्ड युक्त फ़ाइल) को कमिट किया है, तो आपको इसे रिपॉजिटरी के इतिहास से पूरी तरह से हटा देना चाहिए। यहां बताया गया है कि यह कैसे करना है: http://help.github.com/remove-sensitive-data/


13
इस उत्तर में किसी अन्य वेबसाइट से लिंक करने के बजाय इस कार्य को पूरा करने के लिए आवश्यक आदेश शामिल होने चाहिए।
फ्लोरियन लेमिट्रे

1
मैं यह भी नोट करूँगा कि मैंने git bfg रेपो क्लीनर टूल का उपयोग आसान और तेज़ पाया।
लुबेड अप स्लग

64

एक अधिक सामान्य समाधान:

  1. .gitignoreफ़ाइल संपादित करें ।

    ECHO mylogfile.log >> .gitignore

  2. सूचकांक से सभी आइटम निकालें।

    git rm -r -f --cached .

  3. सूचकांक का पुनर्निर्माण करें।

    git add .

  4. नया कमिट करें

    git commit -m "Removed mylogfile.log"


2
क्या यह वास्तव में फ़ाइल को हटा देगा?
Mr_and_Mrs_D

6
गिटहब से? नहीं। यदि आपने पहले ही जीथब को धक्का दे दिया है, तो इसे साइट से नहीं हटाया जाएगा। लेकिन यह आपके स्थानीय गिट रिपॉजिटरी को अपडेट करेगा।
mAsT3RpEE

5
आपके द्वारा हटाई गई टिप्पणी वास्तव में अधिक समाप्त हो गई थी :) समाधान के साथ समस्या rm --cashedयह है कि यह अंततः फाइल को हटा देगा जब कोई खींचता है - ठीक है? और यह वह नहीं है जो लोग चाहते हैं जब वे कहते हैं " स्थानीय फाइल सिस्टम से इसे हटाने के बिना भंडार से एक फ़ाइल निकालें "। अब क्यों स्वीकार किया गया ऊपर का समाधान मुझसे परे है - शायद ओपी अकेले काम कर रहा था और कभी खींचा नहीं गया था? पता नहीं। मैं समझता हूं कि
गितुब

मुझे नहीं लगता कि 100% समाधान है जब तक कि आप खुद से जीथब न पूछें। अभी के लिए इस के लिए छड़ी। फाइल कॉपी करें, gitignore में जोड़ें, वास्तविक git rm -r करें, कमिट करें, पुश करें, फाइल को रिस्टोर करें। क्या आपने दूसरा समाधान खोजने का प्रबंधन किया?
mAsT3RpEE

9
मेरी समस्या गिथब नहीं है - यह है कि फ़ाइल वास्तव में सहकर्मियों से हटा दी जाएगी जब वे खींच लेंगे । मैं नहीं चाहता कि फ़ाइल हटाई जाए। इससे अतीत में मुझे भारी परेशानी हुई है। इसलिए मैं सोच रहा था कि क्या वास्तव में कोई समाधान है जो वास्तव में फ़ाइल को नहीं हटाता है। टिप्पणी को भी देखे गए उत्तर को देखें: stackoverflow.com/questions/1143796/…
Mr_and_Mrs_D

24

गिट आपको अपरिवर्तित मानकर उन फ़ाइलों को अनदेखा कर देता है। यह git update-index --assume-unchanged path/to/file.txtकमांड चलाकर किया जाता है । एक बार फ़ाइल को इस तरह से चिह्नित करने के बाद, git उस फ़ाइल के किसी भी परिवर्तन को पूरी तरह से अनदेखा कर देगा; git स्टेटस या git के अलग होने पर वे दिखाई नहीं देंगे, और न ही वे कभी प्रतिबद्ध होंगे।

( Https://help.github.com/articles/ignoring-files से )

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

नोट: यह सीधे प्रश्न का उत्तर नहीं दे रहा है, लेकिन अन्य उत्तरों की टिप्पणियों में अनुवर्ती प्रश्नों पर आधारित है।


2
हम्म, मैं ऐसा करता हूं, लेकिन मैं देखता हूं कि अगर किसी और रेपो में कोई बदलाव करता है तो फाइल को ओवरराइट किया जा सकता है।
AlxVallejo

17

यदि आप किसी फ़ाइल को अनट्रैक करना चाहते हैं और लोकल और रिमोट रेपो से डिलीट नहीं करना चाहते हैं तो थिस कमांड का उपयोग करें:

git update-index --assume-unchanged  file_name_with_path

2
हालांकि यह एक अच्छा जवाब है, यह नोट करना महत्वपूर्ण है कि यह "फ़ाइल" को इस अर्थ में "अनट्रैक" नहीं करता है कि लोग आमतौर पर उस शब्द का उपयोग Git के साथ करते हैं, जहां एक अनट्रैक फ़ाइल वह है जो रिपॉजिटरी इतिहास में नहीं है और कभी नहीं किया गया है । यह उत्तर क्या करता है, फाइल को रिपॉजिटरी में रखा जाता है, लेकिन Git को यह ध्यान देने से रोकता है कि इसमें परिवर्तन किए गए हैं। इसमें कुछ महत्वपूर्ण अंतर हैं - सबसे महत्वपूर्ण बात, फ़ाइल अभी भी दूसरों के लिए मौजूद है, और अगर कोई और व्यक्ति इसमें बदलाव करता है और आप खींचते हैं, तो आपकी स्थानीय प्रतिलिपि को पुष्टि के बिना अधिलेखित किया जा सकता है।
सोरेन ब्योर्नस्टैड

8

उपरोक्त उत्तर मेरे लिए कारगर नहीं थे। मैं filter-branchसभी प्रतिबद्ध फ़ाइलों को हटा देता था।

इसके साथ एक गिट रिपॉजिटरी से एक फाइल निकालें:

git filter-branch --tree-filter 'rm  file'

के साथ git रिपॉजिटरी से एक फ़ोल्डर निकालें:

git filter-branch --tree-filter 'rm -rf directory'

यह सभी कमिट्स से डायरेक्टरी या फाइल को हटा देता है।

आप का उपयोग करके एक प्रतिबद्ध निर्दिष्ट कर सकते हैं:

git filter-branch --tree-filter 'rm -rf directory' HEAD

या एक सीमा:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

सब कुछ दूरस्थ करने के लिए, आप कर सकते हैं:

git push origin master --force

2
के साथ संयुक्त यह git rm -r --cached NAMEअपने स्थानीय Git रेपो से हटाने और जो बाद में खींचती है को प्रभावित करने से रोकने के लिए चाल है (फ़ाइल या Git से निर्देशिका के इतिहास को हटाने के द्वारा।)
notbad.jpeg

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

0

फ़ाइलों को अनदेखा करें, फ़ाइलों को गिट से हटा दें, गिट को अपडेट करें (हटाने के लिए)।

नोट: यह संवेदनशील जानकारी के लिए इतिहास के साथ सौदा नहीं करता है।

यह प्रक्रिया निश्चित रूप से इस बात का कुछ उपक्रम करती है कि क्या चल रहा है। समय के साथ, यह होने के कारण, मैंने इस तरह की प्रक्रियाएँ करना सीख लिया है:

1) फाइलों पर ध्यान न दें

  • .gitignoreउन्हें अनदेखा करने के लिए प्रोजेक्ट को जोड़ें या अपडेट करें - जैसे कि आपके, माता-पिता की निर्देशिका जैसे, उदाहरण के log/लिए रेगेक्स का उपयोग करना होगा।
  • उस .gitignoreफ़ाइल परिवर्तन को कमिट करें और धकेलें (सुनिश्चित करें कि यदि पुश की आवश्यकता है तो मन आपके लिए, कोई नुकसान नहीं हुआ है)।

2) फ़ाइलों को git (केवल) से निकालें।

  • अब git (केवल) से फ़ाइलों को हटा दें git remove --cached some_dir/
  • जांचें कि वे अभी भी स्थानीय रूप से बने हुए हैं (उन्हें चाहिए!)।

3) उस परिवर्तन को जोड़ें और प्रतिबद्ध करें (अनिवार्य रूप से यह "जोड़ना" हटाना सामान है, अन्यथा भ्रमित "जोड़ने" कमांड के बावजूद)!

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