म्यूरियल या गिट से cvs में संशोधन इतिहास कैसे निर्यात करें?


100

मैं एक परियोजना से दूसरे लोगों के साथ काम करने जा रहा हूं, जो कि cvs का उपयोग करता है। हम अपना काम करने के लिए एक वितरित वीकेएस का उपयोग करना चाहते हैं और जब हम समाप्त करते हैं या हो सकता है कि हर एक समय में एक बार हम अपने कोड और हमारे सभी संशोधन इतिहास को cvs के लिए करना चाहते हैं। हमारे पास प्रोजेक्ट के cv रेपो तक पहुंच नहीं है, इसलिए हम बहुत बार नहीं कर सकते। Cvs को हमारे संशोधन इतिहास को निर्यात करने के लिए हम किस टूल का उपयोग कर सकते हैं? वर्तमान में हम गिट या मर्क्यूरियल का उपयोग करने के बारे में सोच रहे थे, लेकिन अगर हम निर्यात को आसान बना सकते हैं तो हम एक और वितरित वीकेएस का उपयोग कर सकते हैं।


जब आप "वितरित सीवीएस" कहते हैं, तो मुझे लगता है कि आप का अर्थ है "विरूपित वीसीएस," या "डीवीसीएस", जो "वितरित संस्करण नियंत्रण प्रणाली" के लिए खड़ा है।
पैट्रिक मैक्लेनी

मेरा मतलब है एक वितरित संस्करण नियंत्रण प्रणाली।
tatsuhirosatou 16

जवाबों:


237

सौभाग्य से हम में से जो अभी भी सीवीएस का उपयोग करने के लिए मजबूर हैं, गिट बहुत अच्छे उपकरण प्रदान करते हैं जो आप करना चाहते हैं। मेरे सुझाव (और हम $ काम पर यहाँ क्या करते हैं):

प्रारंभिक क्लोन बनाना

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

किसी भी तरह से, दो बातों को ध्यान में रखना:

  1. सुनिश्चित करें कि आप अपने गिट रिपॉजिटरी के रूट डायरेक्टरी में हैं। यदि आप कहीं और हैं, तो यह एक ताजा करने की कोशिश करेगाcvsimport करेगा जो फिर से हमेशा के लिए ले जाएगा।
  2. सुनिश्चित करें कि आप अपने पर हैं 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

कुल मिलाकर, मैंने इस काम-प्रवाह को काफी प्रबंधनीय और "अगली सबसे अच्छी बात" माना है जब पूरी तरह से पलायन करने के लिए व्यावहारिक नहीं है।


3
धन्यवाद। इसने मुझे बहुत मदद की है, विशेष रूप से सीवीएस के लिए परिवर्तनों को बंडल करने के लिए एक गैर-फास्टवर्ड मर्ज का उपयोग करने के बारे में टिप ने एक ही प्रतिबद्ध में।
स्किपहॉपी

8
रिकॉर्ड के लिए, आपके द्वारा git-cvsimport का उपयोग करने के लिए सुझाए गए विकल्प को मैनपेज में "अनुशंसित नहीं है ..." के रूप में उल्लिखित किया गया है। मेरे मामले में, मैं वास्तव में जिस तरह से लेखकों के रूप में बाहर आया हूं।
स्किपहोप्पी

2
सुझावों के लिए धन्यवाद। एक आसान काम जो मैंने किया है वह है "cvs =! Git cvsimport -k -a" के तहत [। Alit] के तहत मेरे .gitconfig में। यह इसे बनाता है ताकि "git cvs" DTRT (पेड़ के ऊपर से) हो जाए।
bstpierre

1
यदि आप git cvsimportडेबियन कोशिश पर याद कर रहे हैंapt-get install git-cvs
टीनो

5
मैक OSX mavricks में पूरी तरह से cv की कमी है और ऐसा लगता है कि git cvsimport cv पर निर्भर करता है। Initialized empty Git repository in /Users/gus/projects/foo/foobar/.git/ Can't exec "cvsps": No such file or directory at /Applications/Xcode.app/Contents/Developer/usr/libexec/git-core/git-cvsimport line 777. Could not start cvsps: No such file or directory git cvsimport: fatal: cvsps reported errorइसलिए दुख की बात है कि यह आपको CVS के अभाव में नहीं मिलता है :(
Gus

22

आपको cvsimport पर आँख बंद करके भरोसा नहीं करना चाहिए और जाँच करें कि आयातित पेड़ CVS रेपो में है या नहीं। मैंने ग्रहण सीवीएस प्लग-इन का उपयोग करके नई परियोजना साझा करके ऐसा किया है और पाया कि विसंगतियां थीं।

एक ही प्रतिबद्ध संदेश के साथ एक मिनट से भी कम समय में किए गए दो कमिट (गलत तरीके से हटाई गई फ़ाइल को वापस करने के लिए) को एक बड़ी प्रतिबद्ध में वर्गीकृत किया गया था, जिसके परिणामस्वरूप पेड़ से एक लापता फाइल मिली थी।

मैं एक मिनट से भी कम समय में 'फ़ज़' पैरामीटर को संशोधित करके इस समस्या को हल करने में सक्षम था।

उदाहरण:

% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
  -A /path/to/authors/file cvs_module_to_checkout -z 15

निचला रेखा: आयात करने के बाद अपने पेड़ की जाँच करें


3

ब्रायन फिलिप्स जवाब के अलावा: git-cvsserver भी है जो CVS सर्वर की तरह कार्य करता है लेकिन वास्तव में git रिपॉजिटरी एक्सेस करता है ... लेकिन इसकी कुछ सीमाएँ हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.