2012-06-15 17 views
22

कनवर्ट करें मेरे पास ISO-8859-1 में फ़ाइलों वाली एक बड़ी सीवीएस रिपोजिटरी है और इसे गिट में परिवर्तित करना चाहते हैं।गिट रिपोजिटरी फ़ाइल एन्कोडिंग

निश्चित रूप से मैं एन्कोडिंग के लिए ISO-8859-1 का उपयोग करने के लिए गिट को कॉन्फ़िगर कर सकता हूं, लेकिन मैं इसे utf8 में रखना चाहता हूं।

अब iconv या recode जैसे टूल के साथ मैं अपने काम करने वाले पेड़ में फ़ाइलों के लिए एन्कोडिंग को परिवर्तित कर सकता हूं। मैं इसे converted encoding जैसे संदेश के साथ प्रतिबद्ध कर सकता हूं।

मेरा प्रश्न अब है, क्या पूरा इतिहास बदलने की संभावना है? या तो जब सीवी से गिट या बाद में परिवर्तित हो जाते हैं। मेरा विचार एक स्क्रिप्ट लिखना होगा जो गिट रिपॉजिटरी में प्रत्येक प्रतिबद्धता को पढ़ता है और इसे utf8 में परिवर्तित करने और इसे एक नए गिट भंडार में प्रतिबद्ध करने के लिए होगा।

क्या यह संभव है (मैं हैश कोड के बारे में अनिश्चित हूं और कैसे काम करता हूं, शाखाओं और टैगों के माध्यम से कैसे चलना है)। या कोई ऐसा उपकरण है जो इस तरह कुछ संभाल सकता है?

+3

हां, आप इतिहास को फिर से लिख सकते हैं, लेकिन शायद आपको यह नहीं करना चाहिए: आपको कभी भी एक भंडार को फिर से लिखना नहीं चाहिए, जिसे आपने पहले ही कहीं धक्का दिया है। मेरी राय है: 'iconv' और सामान्य प्रतिबद्धता जाने का तरीका है। – KingCrunch

+1

ठीक है, धन्यवाद @ किंग कंचन। लेकिन चूंकि मैंने गिट रिपोजिटरी को नया बनाया है, इसलिए इसे कहीं भी धक्का नहीं दिया जाता है। और मैं पहले के इतिहास के आधार पर 'utf8'' एन्कोडिंग के साथ एक दूसरा भंडार बनाने के लिए स्वीकार करूंगा। जो मूल रूप से वही है जो मैं मौजूदा रेपो को संशोधित नहीं करता। –

उत्तर

17

आप इसे git filter-branch के साथ कर सकते हैं। विचार यह है कि आपको प्रत्येक प्रतिबद्धता में फ़ाइलों के एन्कोडिंग को बदलना होगा, प्रत्येक प्रतिबद्धता को फिर से लिखना होगा।

सबसे पहले, एक स्क्रिप्ट लिखें जो भंडार में प्रत्येक फ़ाइल के एन्कोडिंग को बदलती है। यह ऐसा दिखाई दे सकता:

#!/bin/sh 

find . -type f -print | while read f; do 
     mv -i "$f" "$f.recode.$$" 
     iconv -f iso-8859-1 -t utf-8 < "$f.recode.$$" > "$f" 
     rm -f "$f.recode.$$" 
done 

फिर git filter-branch इस स्क्रिप्ट बार बार चलाने के लिए, एक बार प्रति प्रतिबद्ध का उपयोग करें:

git filter-branch --tree-filter /tmp/recode-all-files HEAD 

जहां /tmp/recode-all-files ऊपर स्क्रिप्ट है।

भंडार के तुरंत बाद सीवीएस से अपग्रेड किया गया है, तो संभवत: शुरुआत में एक रैखिक इतिहास के साथ आपके पास गिट में केवल एक शाखा है। यदि आपके पास कई शाखाएं हैं, तो आपको सभी कामों को संपादित करने के लिए git filter-branch कमांड को बढ़ाने की आवश्यकता हो सकती है।

+0

बढ़िया! वर्तमान में कमांड एक परीक्षण गिट भंडार पर चल रहा है। दरअसल मेरे पास बहुत सारी शाखाएं हैं, मैंने अभी दस्तावेज की जांच की है, क्या मुझे बस सभी शाखाओं को फ़िल्टर करने के लिए '' --all'' जोड़ना है? –

+0

अन्य सभी के लिए, 'गिट फ़िल्टर-शाखा - फ्री-फिल्टर/टीएमपी/रिकोड-ऑल-फाइल - - सभी 'शाखाएं सभी शाखाओं को फ़िल्टर करती हैं। –

+1

मैं आपके उत्तर का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे रिकोड-ऑल-फाइलें मिलती हैं: कमांड नहीं मिला। मैं एक मैक का उपयोग कर रहा हूं, ऐसा लगता है कि iconv इंस्टॉल है, मुझे नहीं पता कि मुझे – marimaf

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