परिदृश्य निम्न है:गिट फ़िल्टर-शाखा ने एक डिस्कनेक्ट इतिहास का नेतृत्व किया: पुराने कामों से कैसे छुटकारा पाएं?
मेरे पास एक बड़ा सीवीएस भंडार है जिसे मैं 14 विशिष्ट गिट भंडारों में परिवर्तित करना चाहता हूं। cvs2git
प्रक्रिया का हिस्सा ठीक है और एक बड़ी भंडार repo.git की ओर जाता है।
14 Git रेपो में से प्रत्येक के लिए, मैं मुख्य रेपो क्लोन और मैं निम्नलिखित कमांड चलाएँ:
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
हालांकि, इस आदेश से पहले, मैं कुछ Git संग्रह क्योंकि के लिए एक और git filter-branch
आदेश प्रदर्शन करने के लिए है मुझे एक निर्देशिका से दूसरी निर्देशिका में फ़ाइल को स्थानांतरित करने के लिए प्रतिबद्धताओं को फिर से लिखना होगा। --tree-filter
वह विकल्प है जिसका मैं उपयोग करता हूं।
script_tree_filter="if test -f rep/to/my/file && test -d another/rep ; then echo Moving my file ; mv rep/to/my/file another/rep; fi"
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --tree-filter '$script_tree_filter' -- --all
प्रक्रिया के अंत में: यहाँ कमांड लाइन का एक उदाहरण मार डाला है (14500 प्रतिबद्ध: इसके बारे में 1 घंटा लगता है!) मैं refs साफ और प्रयोग git gc
:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
पर अंत में मैं 1.2 जीओ के आकार के साथ एक भंडार प्राप्त करता हूं (जो अभी भी बहुत बड़ा है), और कामों को देखकर, मैं देख सकता हूं कि बहुत से पुराने लोग अभी भी मौजूद हैं। वे फ़ाइल और निर्देशिकाओं से संबंधित हैं जो --subdirectory-filter
कमांड के बाद और यहां नहीं रहना चाहिए।
मैं बहुत कुछ है कि उन प्रतिबद्ध अभी भी वजह से मौजूद हैं हूँ:
प्रतिबद्ध के इतिहास में, वहाँ gitk --all
के रूप में देखा अवांछित करता और अच्छे के बीच एक अलगाव है उन पर कुछ पर टैग। यदि ऐसा है, तो क्या अच्छे टैग पर किसी को हटाए बिना उन टैग को हटाना संभव है?
यदि टैग कारण नहीं हैं, तो कोई विचार?
अधिक जानकारी के लिए refs
निर्देशिका की सामग्री (Git भंडार उपनिर्देशिका फिल्टर द्वारा प्राप्त में) खाली है:
$ ls -R refs/
refs/:
heads original tags
refs/heads:
refs/original:
refs
refs/original/refs:
heads tags
refs/original/refs/heads:
refs/original/refs/tags:
refs/tags:
मैं पाया है कि शाखाओं और टैग फ़ाइल packed-refs
में सूचीबद्ध हैं गिट भंडार में:
d0c675d8f198ce08bb68f368b6ca83b5fea70a2b refs/tags/v03-rev-04
95c3f91a4e92e9bd11573ff4bb8ed4b61448d8f7 refs/tags/v03-rev-05
फ़ाइल में सूचीबद्ध 817 टैग और 21 9 शाखाएं हैं।
'git gc' टैग रीफ को पैक किया जाएगा .git/packed-refs, इसलिए खाली निर्देशिकाएं। मुझे यकीन नहीं है कि टैग पुराने कामों को क्यों इंगित करेंगे, हालांकि प्रत्येक फिल्टर-शाखा सेशन ने '--tag-name-filter' का उपयोग किया था .... – torek
क्या आपने इस पोस्ट के 4 आदेशों के अनुसार साफ किया था ?http://stackoverflow.com/a/7966852/11343 – CharlesB
'रीसेट हार्ड' को छोड़कर, मैंने अपने प्रश्न में उल्लिखित 3 अन्य कमांड किए हैं ('rm -rf .git/refs/original /' लिखा नहीं गया है वैसे ही जब मेरे पास एक नंगे भंडार है)। मैंने जीसी के '--ग्रेशिव' विकल्प का उपयोग नहीं किया, लेकिन मैं कोशिश नहीं कर सकता (मुझे नहीं लगता कि यह कुछ भी बदलेगा)। – Frodon