2012-12-21 19 views
14

गिट रेपो, एक फ़ाइल ABC है जिसमें तीन फाइलें हैं, सभी file - 1.ext, file - 2.ext, और file - 3.ext नाम में रिक्त स्थान हैं। मैं फ़ोल्डर और फाइलों को हटाना चाहता हूं। मैं इस आदेशसभी पिछली प्रतिबद्धताओं से एक निर्देशिका हटाएं

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

तो आप git push origin master --force के माध्यम से कैसे फ़ाइलें निकालने के लिए की केवल बारे में पता कर रहा हूँ।

(1) लेकिन आप सभी पिछले प्रतिबद्ध से फ़ोल्डर ABC, और उसकी फ़ाइलें निकालते हैं?

इसके अलावा, फ़ाइलें नाम पर रिक्त स्थान है और निम्नलिखित उन्हें रेपो में पता नहीं लगा पा रहा है करता है:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file\ -\ 1.ext' \--prune-empty --tag-name-filter cat -- --all 

(2) क्या वाक्य रचना नामों में रिक्तियां साथ फ़ाइलें निकालने के लिए किया जाना चाहिए ? नोट्स

  • OSX
  • GitHub
+2

बन गए होते क्यों आप उन सभी को प्रतिबद्ध से हटाना चाहते हैं? प्रतिबद्धताएं आपकी परियोजना के स्नैपशॉट हैं। जब आप कुछ डीआईआर या फाइलों को हटाना चाहते हैं तो आपको एक नई प्रतिबद्धता बनाना चाहिए जो उन्हें आपकी परियोजना से हटा देता है। –

+12

@WouterJ कभी-कभी आप भंडार के इतिहास से बेकार, बड़ी फ़ाइलों को हटाना चाहते हैं, या शायद संवेदनशील जानकारी वाले फ़ाइलों को हटा सकते हैं। –

उत्तर

20

आप के

$ git lola --name-status 
* e709131 (HEAD, master) bar 
| A  bar 
* 61493ac ABC/file - 3.ext 
| A  ABC/file - 3.ext 
* 34cce9e ABC/file - 2.ext 
| A  ABC/file - 2.ext 
* 115e6d5 ABC/file - 1.ext 
| A  ABC/file - 1.ext 
* 5ea5b42 foo 
    A  foo

नोट एक इतिहास के साथ शुरू करते हैं कहते हैं: git lola एक गैर मानक लेकिन अत्यधिक उपयोगी उर्फ ​​है।

git rm subtrees को दूर करने के लिए एक विकल्प का समर्थन करता है।

-r
पुनरावर्ती निकलने दें जब एक प्रमुख निर्देशिका का नाम दिया जाता है।

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

चल आप उत्पादन है कि जैसा दिखता है

Rewrite 115e6d5cd06565ca08f1e5c98c4b91246cf59fa1 (2/5)rm 'ABC/file - 1.ext' 
Rewrite 34cce9e90f832460137e620ebacc8a73a99e64ce (3/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
Rewrite 61493ac3211808f34f616dbc33d51d193b3f45a3 (4/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
rm 'ABC/file - 3.ext' 
Rewrite e709131f1fe6103adf37616c9fa500994aeb30d0 (5/5)rm 'ABC/file - 1.ext' 
rm 'ABC/file - 2.ext' 
rm 'ABC/file - 3.ext' 

Ref 'refs/heads/master' was rewritten

आप परिणाम से खुश हैं तो देखेंगे के बाद,

$ git update-ref -d refs/original/refs/heads/master

और अब के साथ पुराने मास्टर हटाना आप

012,351 का इतिहास है
$ git lola --name-status 
* 19680d4 (HEAD, master) bar 
| A  bar 
* 5ea5b42 foo 
    A  foo

अपने दूसरे प्रश्न का उत्तर देने के लिए, आप केवल ABC/file - 2.ext को हटाना चाहते हैं। याद रखें कि आप के हवाले से की दो परतों की आवश्यकता होगी: कि आदेश के लिए एक बहस में रिक्त स्थान से बचने के लिए पूरे आदेश के लिए एक परत और एक अन्य, फ़ाइल का नाम हटाने के लिए।

एक तरीका यह है कि ऐसा करने के लिए

$ git filter-branch --index-filter \ 
    'git rm --cached --ignore-unmatch "ABC/file - 2.ext"' --prune-empty \ 
    --tag-name-filter cat -- --all

नोट सिंगल कोट्स के अंदर दोहरे उद्धरण चिह्नों है।

आप इस आदेश के बजाय समाप्त हो चुकी थी, तो अपने इतिहास

$ git lola 
* a8d1b0d (HEAD, master) bar 
* cff0c4e ABC/file - 3.ext 
* 115e6d5 ABC/file - 1.ext 
* 5ea5b42 foo
11

--index-filter उपयोग करने के बजाय, --tree-filter के साथ प्रयास करें:

--tree-filter <command> 
    This is the filter for rewriting the tree and its contents. The argument is 
    evaluated in shell with the working directory set to the root of the 
    checked out tree. The new tree is then used as-is 
    (new files are auto-added, disappeared files are auto-removed - 
    neither .gitignore files nor any other ignore rules HAVE ANY EFFECT!). 

कमांडलाइन:

git filter-branch --tree-filter 'rm -rf path/to/ABC' \ 
    --prune-empty --tag-name-filter cat -- --all