2016-07-12 5 views
5

मैंने काफी बड़े एसवीएन भंडार को माइग्रेट करने के लिए एक साधारण स्क्रिप्ट बनाई है। git svn clone का उपयोग करने के बजाय, मैं git svn init और git svn fetch का उपयोग कर रहा हूं ताकि मैं संशोधन निर्दिष्ट कर सकूं और इसे खंड द्वारा खंडित कर सकूं।गिट-एसवीएन लाने और खाली निर्देशिका को कैसे बनाए रखें?

while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do 
    END_REVISION=$((CURRENT_REVISION + 100)) 
    if [ "$END_REVISION" -ge "$MAX_REVISION" ] 
    then 
    END_REVISION=$MAX_REVISION 
    fi 

    git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE" 

    #increasing the current and end revision 
    CURRENT_REVISION=$END_REVISION 
    END_REVISION=$((CURRENT_REVISION + 100)) 
done 

हालांकि, मैं समझता हूँ कि डिफ़ॉल्ट रूप से लाने/क्लोन के व्यवहार खाली निर्देशिका नहीं रह जाएगी: कम या ज्यादा, यह कुछ इस तरह है। इस प्रकार, मुझे उन खाली निर्देशिकाओं में मैन्युअल रूप से जांच करने की आवश्यकता हो सकती है (* जिन्हें मैं टालने का प्रयास कर रहा हूं)।

में --preserve-empty-dirs पैरामीटर है लेकिन git svn fetch में नहीं है।

क्या यह चाल करने के लिए कोई कामकाज है?

अद्यतन

भले ही यह आधिकारिक दस्तावेज है कि हम के लिए config कुंजी का उपयोग कर सकते हैं लाने में उल्लेख नहीं है, यह वास्तव में काम करता है

इस से संबंधित @Vampire द्वारा विस्तृत विवरण नहीं है सवाल। तो मैं इसे सरल बना दूंगा।

init भंडार करने के बाद, मैं अपने दूरस्थ शाखा के विन्यास बदलना पड़ा:

git config svn-remote.<remote name>.preserve-empty-dirs "true"

git config svn-remote.<remote name>.placeholder-filename ".gitkeep"

आप /.git/config को देखकर विन्यास को सत्यापित कर सकते हैं। बस सामान्य fetch करें और आपकी निर्देशिका संरक्षित किया जाएगा।

+0

क्या आप इसे एक बार रूपांतरण के लिए उपयोग करते हैं, या आप गिट-एसवीएन का उपयोग सबवर्सन रिपोजिटरी के सामने के रूप में करने के लिए करना चाहते हैं जो अभी भी आपके कोड के लिए कैनोलिक स्रोत होगा? – Vampire

+0

हां, मैं कह सकता हूं कि यह एक बार रूपांतरण है। – alfonzjanfrithz

उत्तर

3

git-svn भंडारों के एक-बार रूपांतरण के लिए सही उपकरण नहीं है। यदि आप गिट को मौजूदा एसवीएन सर्वर के लिए फ्रंटेंड के रूप में उपयोग करना चाहते हैं, तो यह एक अच्छा टूल है, लेकिन एक बार के रूपांतरणों के लिए आपको git-svn का उपयोग करना चाहिए, लेकिन svn2git जो इस उपयोग-मामले के लिए अधिक उपयुक्त है।

svn2git नामक प्लेनी उपकरण हैं, शायद https://github.com/svn-all-fast-export/svn2git से केडीई एक सबसे अच्छा है। मैं दृढ़ता से उस svn2git उपकरण का उपयोग करने की सलाह देते हैं। यह सबसे अच्छा है जो मुझे पता है कि वहां उपलब्ध है और यह नियमों के साथ आप क्या कर सकते हैं में बहुत लचीला है।

आप अपने भंडार के इतिहास के बारे में 100% नहीं हैं, तो svnevereverhttp://blog.hartwork.org/?p=763 से जब यह Git की ओर पलायन एक SVN भंडार के इतिहास की जांच करने के लिए एक महान उपकरण है।


आप अभी भी git svn का उपयोग करना चाहते हैं, तो आप manally अपने प्राप्त कर रहा है हंक की जरूरत नहीं है। अगर आप रोकना चाहते हैं तो बस git svn clone ... करें, निष्पादन रद्द करें और फिर git svn fetch लाने की प्रक्रिया जारी रखने के लिए करें। यह स्वचालित रूप से जारी रहेगा जहां यह काम करना बंद कर दिया गया है और अंतिम प्राप्त किए गए संशोधन को भी मान्य करता है कि क्या इसे पूरी तरह से लाया गया था या फिर रीफ्रेट करने की आवश्यकता है।


आप अभी भी मैन्युअल रूप से अपने प्राप्त कर रहा है हंक के लिए, ध्यान रखें कि git svn clone ... बिल्कुल git svn init ...git svn fetch के बाद के रूप में एक ही है, अपवाद के साथ चाहते हैं कि clone विशिष्ट मानदंडों के अनुसार config गुण svn-remote.<remote name>.preserve-empty-dirstrue पर सेट है और svn-remote.<remote name>.placeholder-filename उस तर्क पर सेट है जिसे आपने init और fetch के बीच दिया था। तो बस अपने init के बाद और अपने लाने से पहले मैन्युअल रूप से ऐसा करें और आप ठीक हैं।

एक टिप्पणी हालांकि:preserve-empty-dirs afair अगर आप और आप केवल Git भंडार बाद में उपयोग कर रहे हैं Git भंडार में उन खाली निर्देशिका की आवश्यकता है केवल आवश्यक है। जब तक आप केवल git svn का उपयोग एक बाहरी एसवीएन भंडार के सामने के रूप में करते हैं, तो emtpy dirs स्वचालित रूप से आपके कार्यक्षेत्र में बनाया जाना चाहिए और वास्तविक भंडार इतिहास का हिस्सा नहीं होना चाहिए। क्या preserve-empty-dirs करता है, प्रतिबद्ध करने के लिए खाली .gitignore फ़ाइल (या जो भी आपने अन्य पैरामीटर/कॉन्फ़िगरेशन प्रॉपर्टी के साथ कॉन्फ़िगर किया है) जोड़ना है, ताकि फ़ोल्डर अनिवार्य रूप से खाली न हो। ऐसा इसलिए किया जाता है क्योंकि गिट एक सामग्री ट्रैकर है, न कि फाइल सिस्टम ट्रैकर। यह आपके स्रोत कोड को ट्रैक करता है जो फाइलों में संग्रहीत होता है, फाइलों और फ़ोल्डरों को स्वयं नहीं। यही कारण है कि गिट में एक स्पष्ट move या copy ऑपरेशन जैसी कोई चीज़ नहीं है, क्योंकि आवश्यक और इच्छित उड़ान पर प्रतियां और प्रतियां निर्धारित की जाती हैं। तकनीकी रूप से यह और addmove या copy के लिए एक साधारण add के लिए है।

+0

धन्यवाद! मैं इस समाधान पर एक अद्यतन दूंगा। मैं मूल रूप से 'svn-remote जोड़ दूंगा। .preserve-blank-dirs' मेरी कॉन्फ़िगरेशन पर और रेपो फिर से प्राप्त करें। बहुत बुरा है कि आधिकारिक दस्तावेज स्पष्ट रूप से यह नहीं बताता कि 'संरक्षित-खाली-डीआईआरएस' को कॉन्फ़िगर कुंजी में जोड़ा जा सकता है। ज्ञान के लिए धन्यवाद। मैं सभी svn सक्रिय शाखा को देखकर एक और समाधान भी कोशिश कर सकता हूं। सभी खाली डीआईआर में एक डमी फ़ाइल को छूने के लिए कुछ कमांड प्राप्त करें, उन डीआईआर को गिट वर्कस्पेस पर वापस कॉपी करें और उसके लिए नई गिट प्रतिबद्ध बनाएं। – alfonzjanfrithz

+0

मुझे यह त्रुटि मिलती है: 'svn-all-fast-export: /build/subversion-8E3yhQ/subversion-1.9.3/subversion/libsvn_subr/dirent_uri.c:972: svn_dirent_join: दावा \' svn_dirent_is_canonical (आधार, पूल) ' असफल रहा। 'वापस' git svn' :-( – peterh

+0

@peterh आपको स्थानीय रूप से रेपो होना है। यहां देखें: https://github.com/svn-all-fast-export/svn2git/issues/3 – Vampire

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