असल में यह संभव है और यह मुद्दा यहां कुछ बार उठाया गया है हालांकि कोई सार्वभौमिक तरीका नहीं है और ऐसा लगता है कि आपको अपना खुद का नुस्खा लिखना है।
यदि आप my_new_subdir
से फ़ाइलों को छोड़ना चाहते हैं तो आपको वास्तव में अन्य सभी फ़ाइलों को हटाने की आवश्यकता है।
git filter-branch --tag-name-filter cat --index-filter \
'git rm -r --cached --ignore-unmatch
unneeded-subdir-1 unneeded-pattern-* unneeded-etc' \
--prune-empty -f -- --all
तो खोजने और क्या हटाए जाने के लिए है आप sth की तरह उपयोग कर सकते हैं मदद करने के लिए: अवधारणा का उपयोग करने के लिए है
git log --name-status --all | grep -P '^\w\s+[\S]+$'
या यहाँ तक कि जैसे:
git log --name-status --all | grep -P '^\w\s+[\S]+$' | \
sed s/^.// | cut -f 1-2 -d '/' | sort -u
इस तरह आप सभी फ़ाइलों/निर्देशिकाओं (या दूसरे मामले में पथ के पहले दो खंड) को पा सकते हैं जो किसी भी समय रेपो में मौजूद थे। उसके बाद आप रेपो साफ करने के लिए निम्न आदेश का उपयोग कर सकते हैं:
git gc --aggressive
तो फाइलों जाने के बाद my_new_subdir
में छोड़ा जा सकता मैंने ऊपर इतिहास से किसी भी अनावश्यक फ़ाइलों को साफ करने के आदेशों के संयोजन का उपयोग किया है। हालांकि मुझे अभी भी इतिहास में असंबंधित विलय मिला लेकिन अंत में मैं परिणाम से संतुष्ट था। ध्यान दें कि उपरोक्त गिट कमांड के लिए पैरामीटर की संख्या है जो सभी इतिहास, शाखाओं और टैगों के माध्यम से चलने के लिए महत्वपूर्ण हैं।
चीजों को तेज़ करने के लिए आप रेपो के सबसे बड़े हिस्सों को पहले पुनरावृत्ति में हटाने के लिए पहचान सकते हैं तो git gc --aggressive
करें। आई 5 सीपीयू और एसएसडी डिस्क होने के कारण मुझे एक git filter-branch
पुनरावृत्ति को पूरा करने में लगभग एक मिनट लग गए और लगभग 1000 इतिहास प्रविष्टियों को संसाधित किया गया है।
दिलचस्प पढ़ता है: http://stackoverflow.com/q/5760331/6309, http://stackoverflow.com/a/16416818/6309। यकीन नहीं है कि यह संभव है। – VonC
मुझे लगता है कि यह समझ में आता है कि यदि निर्देशिका संरचना पूरी तरह से अलग है तो पुराने परिवर्तनों का उपयोग करने का कोई तरीका नहीं होगा। –