सौभाग्य से हम में से जो अभी भी सीवीएस का उपयोग करने के लिए मजबूर हैं, गिट बहुत अच्छे उपकरण प्रदान करते हैं जो आप करना चाहते हैं। मेरे सुझाव (और हम $ काम पर यहाँ क्या करते हैं):
प्रारंभिक क्लोन बनाना
git cvsimport
सीवीएस संशोधन इतिहास को जीआईटी रिपॉजिटरी में क्लोन करने के लिए उपयोग करें । मैं निम्नलिखित आह्वान का उपयोग करता हूं:
% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
-A /path/to/authors/file cvs_module_to_checkout
-A
विकल्प वैकल्पिक है, लेकिन यह है कि सीवीएस से आयात के देखने के अपने संशोधन इतिहास बनाने के लिए मदद करता है और अधिक Git की तरह (देखें man git-cvsimport
कि यह कैसे सेट किया गया है के बारे में अधिक जानकारी के लिए)।
सीवीएस रिपॉजिटरी के आकार और इतिहास के आधार पर, यह पहला आयात बहुत लंबा समय लगेगा। यदि आप मन की शांति चाहते हैं तो आप उपरोक्त आदेश में -v जोड़ सकते हैं कि वास्तव में कुछ हो रहा है।
एक बार जब यह प्रक्रिया पूरी हो जाती है, तो आपके पास एक master
शाखा होगी जो CVS के HEAD को दर्शाती है (इस अपवाद के साथ कि git cvsimport
डिफ़ॉल्ट रूप से पिछले 10 मिनट के कमिट्स को अनदेखा कर देती है, जो आधे-अधूरे काम करने से बचने के लिए प्रतिबद्ध है)। फिर आप git log
दोस्तों और रिपॉजिटरी के पूरे इतिहास की जांच करने के लिए उपयोग कर सकते हैं जैसे कि यह शुरू से ही गिट का उपयोग कर रहा था।
कॉन्फ़िगरेशन Tweaks
कुछ कॉन्फ़िगरेशन ट्विक हैं जो भविष्य में सीवीएस (साथ ही निर्यात) से वृद्धिशील आयात करेंगे। ये git cvsimport
मैन पेज पर प्रलेखित नहीं हैं इसलिए मुझे लगता है कि वे बिना किसी नोटिस के बदल सकते हैं लेकिन, FWIW:
% git config cvsimport.module cvs_module_to_checkout
% git config cvsimport.r cvs
% git config cvsimport.d $CVSROOT
इन सभी विकल्पों को कमांड लाइन पर निर्दिष्ट किया जा सकता है ताकि आप सुरक्षित रूप से इस चरण को छोड़ सकें।
वृद्धिशील आयात
आगामी git cvsimport
में पहले आह्वान की तुलना में बहुत तेज होना चाहिए। हालाँकि, यह cvs rlog
हर डायरेक्टरी (यहां तक कि जिनके पास केवल फाइलें हैं Attic
) पर करता है, इसलिए इसमें कुछ मिनट लग सकते हैं। यदि आपने ऊपर दिए गए सुझाए गए कॉन्फ़िगरेशन को निर्दिष्ट किया है, तो आपको बस इतना करना होगा:
% git cvsimport
यदि आपने डिफॉल्ट्स को निर्दिष्ट करने के लिए अपना कॉन्फिगर सेट नहीं किया है, तो आपको उन्हें कमांड लाइन पर निर्दिष्ट करना होगा:
% git cvsimport -r cvs -d $CVSROOT cvs_module_to_checkout
किसी भी तरह से, दो बातों को ध्यान में रखना:
- सुनिश्चित करें कि आप अपने गिट रिपॉजिटरी के रूट डायरेक्टरी में हैं। यदि आप कहीं और हैं, तो यह एक ताजा करने की कोशिश करेगा
cvsimport
करेगा जो फिर से हमेशा के लिए ले जाएगा।
- सुनिश्चित करें कि आप अपने पर हैं
master
शाखा पर हैं ताकि परिवर्तन आपके स्थानीय / विषय शाखाओं में विलय (या छूट) कर सकें।
स्थानीय परिवर्तन करना
व्यवहार में, मैं हमेशा शाखाओं में परिवर्तन करने और केवल विलय करने की सलाह देता हूं master
तब देता हूं जब आप उन परिवर्तनों को सीवीएस रिपॉजिटरी में वापस निर्यात करने के लिए तैयार होते हैं। आप अपनी शाखाओं पर जो भी वर्कफ़्लो पसंद करते हैं उसका उपयोग कर सकते हैं (विलय, रिबासिंग, स्क्वैशिंग, आदि), लेकिन निश्चित रूप से मानक रिबासिंग नियम लागू होते हैं: यदि कोई और आपकी शाखा में अपने परिवर्तनों को आधार बना रहा है, तो उसे वापस न करें।
सीवीएस में परिवर्तन निर्यात
git cvsexportcommit
आदेश आप एक ही सीवीएस सर्वर से बाहर करने का निर्यात करने की अनुमति देता है। आप एक सिंगल कमिट आईडी (या ऐसी कोई भी चीज जो किसी विशिष्ट कमेटी को परिभाषित करते हैं man git-rev-parse
) बता सकते हैं । एक अंतर तब उत्पन्न होता है, जिसे सीवीएस चेकआउट पर लागू किया जाता है और फिर वास्तविक cvs
ग्राहक का उपयोग करके सीवीएस के लिए प्रतिबद्ध होता है । आप अपनी विषय शाखाओं पर प्रत्येक माइक्रो कमिट को निर्यात कर सकते हैं, लेकिन आम तौर पर मैं एक अप-टू-डेट पर एक मर्ज कमिट बनाना चाहता हूं master
और सीवीएस के लिए एक मर्ज कमिट निर्यात करता हूं । जब आप एक मर्ज कमिट निर्यात करते हैं, तो आपको यह बताना होगा कि डिफरेंट जेनरेट करने के लिए पेरेंट्स को कौन सा कमिटमेंट इस्तेमाल करना है। इसके अलावा, यह तब काम नहीं करेगा जब मर्ज करते समय आपका मर्ज तेज़-फॉरवर्ड ("HOW MERGE WORKS" विकल्प का अनुभाग देखें । यहां एक उदाहरण दिया गया है:man git-merge
फास्ट फॉरवर्ड मर्ज के विवरण के लिए ) ताकि आपको इसका उपयोग करना पड़े--no-ff
# on master
% git merge --no-ff --log -m "Optional commit message here" topic/branch/name
% git cvsexportcommit -w /path/to/cvs/checkout -u -p -c ORIG_HEAD HEAD
आप देख सकते हैं कि git-cvsexportcommit के मैन पेज पर उन विकल्पों में से प्रत्येक का क्या अर्थ है । आपके पास -w
आपके git config में विकल्प सेट करने का विकल्प है:
% git config cvsexportcommit.cvsdir /path/to/cvs/checkout
यदि पैच किसी भी कारण से विफल हो जाता है, तो मेरा अनुभव यह है कि आप (दुर्भाग्य से) शायद मैन्युअल रूप से परिवर्तित फ़ाइलों की प्रतिलिपि बनाने और cvs क्लाइंट का उपयोग करने से बेहतर होंगे। हालाँकि, ऐसा नहीं होना चाहिए, यदि आप सुनिश्चित करें कि master
आपकी विषय शाखा को विलय करने से पहले CVS के साथ अद्यतित है।
यदि कमिट जो भी कारण (नेटवर्क / अनुमति समस्या, आदि) के लिए विफल रहता है, तो आप त्रुटि आउटपुट के अंत में अपने टर्मिनल पर मुद्रित कमांड ले सकते हैं और इसे अपने सीवीएस वर्किंग डायरेक्टरी में निष्पादित कर सकते हैं। यह आमतौर पर कुछ इस तरह दिखता है:
% cvs commit -F .msg file1 file2 file3 etc
अगली बार जब आप एक git cvsimport
(कम से कम 10 मिनट प्रतीक्षा कर रहे हों) आप अपने निर्यात किए गए कमिट के पैच को फिर से अपने स्थानीय भंडार में देख लें। सीवीएस कमिटमेंट में एक अलग टाइमस्टैम्प और संभवत: एक अलग कमिटेटर नाम होगा (यह निर्भर करता है कि क्या आप अपने प्रारंभिक cvsimport
ऊपर एक लेखक फ़ाइल सेट करते हैं) के बाद से उनके पास अलग-अलग प्रतिबद्ध आईडी होंगे ।
अपने CVS क्लोन को क्लोन करना
यदि आपके पास एक से अधिक व्यक्ति करने की आवश्यकता है cvsimport
, तो यह एक एकल गिट रिपॉजिटरी के लिए अधिक कुशल होगा जो कि cvsimport करता है और क्लोन के रूप में बनाए गए अन्य सभी रिपॉजिटरी है। यह पूरी तरह से काम करता है और क्लोन रिपॉजिटरी ऊपर वर्णित के रूप में cvsexportcommits प्रदर्शन कर सकता है। हालांकि, एक कैवेट है। सीवीएस कमिट करने के तरीके के कारण अलग-अलग प्रतिबद्ध आईडी (जैसा कि ऊपर वर्णित है) के माध्यम से वापस आते हैं, आप नहीं चाहते कि आपकी क्लोन शाखा केंद्रीय गिट रिपॉजिटरी को ट्रैक करे। डिफ़ॉल्ट रूप से, यह git clone
आपकी रिपॉजिटरी को कैसे कॉन्फ़िगर करता है लेकिन यह आसानी से पता चलता है:
% git clone [CENTRAL_REPO_HERE]
% cd [NEW_GIT_REPO_DIR_HERE]
% git config --unset branch.master.remote
% git config --unset branch.master.merge
इन कॉन्फ़िगरेशन को हटाने के बाद, आपको स्पष्ट रूप से कहना होगा कि केंद्रीय रिपॉजिटरी से नए कमिट में कब और कहाँ से क्या खींचना है:
% git pull origin master
कुल मिलाकर, मैंने इस काम-प्रवाह को काफी प्रबंधनीय और "अगली सबसे अच्छी बात" माना है जब पूरी तरह से पलायन करने के लिए व्यावहारिक नहीं है।