में मेरे पास एक एसएनएमपी एजेंट की एक परियोजना है जहां संबंधित एमआईबी फाइलें (* .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'
लेकिन मुझे लगता है कि बेहद बदसूरत और गुंजाइश है, इसलिए मैं यह पूछना चाहता हूं कि ऐसा करने के लिए कोई प्रत्यक्ष/उचित तरीका है या नहीं।
एक अतिरिक्त डमी तर्क क्यों न दें जो कभी भी 'git rm --ignore-unmatched'' के लिए मौजूद नहीं है, उदा। '| xargs rm --cached --ignore-unmatched doesNotExistInMyProject'? –
हेहे .. सही @ चार्ल्स बेली, मैं इसे कैसे देख नहीं पाया? क्या आप इसे उत्तर में बदलना नहीं चाहते हैं, इसलिए मैं इसे स्वीकार कर सकता हूं? धन्यवाद! – Claudio