2012-08-29 8 views
5

में मेरे पास एक एसएनएमपी एजेंट की एक परियोजना है जहां संबंधित एमआईबी फाइलें (* .smiv2 फाइलें) इसके साथ विकसित की गई थीं, लेकिन अब मैं उन्हें एक में चाहता हूं अलग गिट भंडार।गीता आरएम के बिना गिट फिल्टर-शाखा के साथ अवांछित फ़ाइलों को हटाने का उचित तरीका

आदेश में एमआईबी फ़ाइलों के इतिहास के किसी भी खोना नहीं है, क्योंकि वे एक ही निर्देशिका वे अब कर रहे हैं में शुरू नहीं किया, मैं सिर्फ --subdirectory-filter फिल्टर शाखा का उपयोग नहीं कर सकता है, तो मैं --filter-index दृष्टिकोण की कोशिश की, पर आधारित this question। विचार .smiv2 (स्पष्ट रूप से मूल प्रोजेक्ट के ताजा क्लोन पर समाप्त होने वाली प्रत्येक फ़ाइल को हटाने के लिए होगा, जिसे प्रक्रिया के अंत तक मेरे नए एमआईबी रेपो में धकेल दिया जाएगा)।

यह आसान बनाने के लिए, मैं ls-tree से अधिक ls-files का उपयोग करते हुए, तो बजाय:

git filter-branch --prune-empty --index-filter 'git ls-tree -r --name-only \ 
--full-tree $GIT_COMMIT | grep -v ".smiv2$" | xargs git rm --cached \ 
--ignore-unmatch -r' 

मैं इस प्रयोग किया है:

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch' 

लेकिन इन में विफल रहा है के किसी भी पहले प्रतिबद्ध है, यह बाद से प्रतीत होता है कि git rm को कोई तर्क नहीं दिया गया था (मुझे लगता है कि --ignore-unmatch ठीक काम करेगा यदि आपूर्ति किए गए तर्क नहीं मिले हैं, लेकिन मामले में कोई तर्क प्रदान नहीं किया जाता है):

$ git filter-branch --prune-empty --index-filter 'git ls-files | \ 
>  grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch' 
Rewrite 4cd2f1c98dbaa96bc103ae81fbd405bd1d991d9a (1/418)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 

index filter failed: git ls-files | \ 
    grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch 

मैं इसे एक स्क्रिप्ट जो सफलता रिटर्न में git rm लपेटकर वर्किंग तर्कों की कमी के कारण भी जब यह विफल रहता है मिल गया (/usr/local/bin/gitrm_alt में यह बचाया):

#!/bin/sh 
git rm --cached --ignore-unmatch "[email protected]" 
exit 0 

और फिर बुला कि git rm के बजाय:

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
    grep -v ".smiv2$" | xargs gitrm_alt' 

लेकिन मुझे लगता है कि बेहद बदसूरत और गुंजाइश है, इसलिए मैं यह पूछना चाहता हूं कि ऐसा करने के लिए कोई प्रत्यक्ष/उचित तरीका है या नहीं।

+0

एक अतिरिक्त डमी तर्क क्यों न दें जो कभी भी 'git rm --ignore-unmatched'' के लिए मौजूद नहीं है, उदा। '| xargs rm --cached --ignore-unmatched doesNotExistInMyProject'? –

+0

हेहे .. सही @ चार्ल्स बेली, मैं इसे कैसे देख नहीं पाया? क्या आप इसे उत्तर में बदलना नहीं चाहते हैं, इसलिए मैं इसे स्वीकार कर सकता हूं? धन्यवाद! – Claudio

उत्तर

7

सबसे आसान समाधान git rm पर एक डमी तर्क जोड़ना होगा ताकि इसमें हमेशा कम से कम एक फ़ाइल पैरामीटर हो।

उदा।

... | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject 
2

पूर्ण उत्तर, भविष्य में संदर्भ के

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject' 
2

xargs के -r के लिए | --no-run-if-empty झंडा क्लीनर हो सकता है:

... | xargs--no-run-if-emptygit rm --cached --ignore-unmatched

0

एक मैं स्विच भी इस्तेमाल किया जा सकता है।

some command | xargs -I % rm % 
संबंधित मुद्दे