2014-10-10 9 views
11

मेरे पास कई उपनिर्देशिकाएं हैं जिन्हें मैं एक अलग रेपो में खींचना चाहता हूं। इन्हें एक ही कमांड के साथ निकालने के लिए मैं रूट के अंदर एक उपनिर्देशिका में स्थानांतरित (नाम बदलें) करता हूं।गिट सबट्री स्प्लिट करते समय नामों का पालन करें

मैं तो चलाएँ: git subtree split -P my_new_subdir -b newbranch

मैं तो इस नई शाखा चेकआउट और चलाने git log --follow someoldfile यह केवल मुझे अस्थायी उपनिर्देशिका में कदम से संबंधित लॉग प्रविष्टियों से पता चलता है। मैं उन फ़ाइलों का पूरा इतिहास लेना चाहता हूं।

क्या उप-विभाजन विभाजित करते समय नामों सहित पूर्ण इतिहास को संरक्षित करने का कोई तरीका है? वांछित परिणाम प्राप्त करने का कोई और माध्यम है?

मैंने रेपो के क्लोन पर फ़िल्टर-शाखा का उपयोग करने पर विचार किया है, लेकिन मुझे पता है कि यह बहुत धीमा होगा।

+0

दिलचस्प पढ़ता है: http://stackoverflow.com/q/5760331/6309, http://stackoverflow.com/a/16416818/6309। यकीन नहीं है कि यह संभव है। – VonC

+0

मुझे लगता है कि यह समझ में आता है कि यदि निर्देशिका संरचना पूरी तरह से अलग है तो पुराने परिवर्तनों का उपयोग करने का कोई तरीका नहीं होगा। –

उत्तर

8

असल में यह संभव है और यह मुद्दा यहां कुछ बार उठाया गया है हालांकि कोई सार्वभौमिक तरीका नहीं है और ऐसा लगता है कि आपको अपना खुद का नुस्खा लिखना है।

यदि आप 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 इतिहास प्रविष्टियों को संसाधित किया गया है।

+0

यह वह समाधान था जिसे मैंने तय किया था लेकिन इसे आजमाने की स्थिति में कभी नहीं था। जवाब देने में व़क्त लेने के लिए शुक्रिया। –

संबंधित मुद्दे