एक

2008-11-06 24 views
53

में एकाधिक SVN खजाने का मेल मेरे पिछले प्रश्न (One SVN Repository or many?) के जवाब पर विचार के बाद, मैं 4 या तो खजाने मैं लेते हैं और उन्हें एक में मजबूत करने के लिए तय कर लिया है। निश्चित रूप से यह सवाल की ओर जाता है, क्या यह करने के लिए सबसे अच्छा तरीका क्या है?एक

वहाँ दोनों के लिए संस्करण इतिहास को बनाए रखने के लिए दो या अधिक खजाने गठबंधन करने के लिए कोई तरीका है?

संपादित करें: मैं भी है कि मैं Assembla.com उपयोग कर रहा हूँ, जो svnadmin आदेश के लिए पहुँच प्रदान नहीं करता है, AFAIK कहना चाहिए

एक और संपादित करें: यह और भी कोई फर्क पड़ता है? svnadmin यूआरएल पर काम करता है, तो यह कोई समस्या नहीं है तो है।

+0

[svnadmin डॉक्टर] (http://svnbook.red-bean.com/en/1.7/svn.ref.svnadmin.html): "चूंकि svnadmin प्रत्यक्ष भंडार पहुंच के माध्यम से काम करता है (और इस प्रकार केवल इसका उपयोग किया जा सकता है मशीन जो भंडार रखती है), यह एक पथ के साथ भंडार को संदर्भित करता है, न कि यूआरएल। " –

उत्तर

67

संपादित नहीं देखा था: ओह ठीक है, सवाल संपादित करें, जबकि मैं टाइप किया गया था बनाया गया था। यह

का जवाब है वहाँ दोनों के लिए संस्करण इतिहास को बनाए रखने के लिए दो या अधिक खजाने गठबंधन करने के लिए कोई तरीका है?


मान लिया जाये कि

मौजूदा खजाने की तरह एक संरचना है कि:

  • भंडार जड़
    • शाखाओं
    • टैग
    • टी runk

और आप की तरह एक संरचना कुछ चाहते हैं:

  • भंडार जड़
    • PROJECTA
      • शाखाओं
      • टैग
      • ट्रंक
    • projectB
      • शाखाओं
      • टैग
      • ट्रंक
अपनी परियोजना खजाने से प्रत्येक के लिए फिर

:

svnadmin dump > project<n>.dmp 
तो डंप फ़ाइलों से प्रत्येक के लिए

:

svn mkdir "<repo url>/project<n>" 
svnadmin load --parent-dir "project<n>" <filesystem path to repos> 

अधिक जटिल जोड़तोड़ संभव हो रहे हैं, लेकिन यह सबसे सरल, सबसे सरल है। एक डंप के दौरान स्रोत भंडार संरचना बदल रहा है/लोड खतरनाक है, लेकिन svnadmin load


एक तीसरी पार्टी प्रदाता

के साथ काम svnadmin dump, svndumpfilter, हाथ से संपादन या अतिरिक्त पाठ फिल्टर का एक संयोजन और के माध्यम से संभव है
  • अपने प्रत्येक भंडार के लिए svnadmin dump फ़ाइलों का अनुरोध करें। प्रदाता इस प्रदान करने को तैयार/सक्षम होना चाहिए - यह अपने कोड है!
  • स्थानीय रूप से एक एसवीएन भंडार बनाएँ।
  • डंप फ़ाइलों के लिए ऊपर सूचीबद्ध कार्यों को निष्पादित करें।
  • भंडार संरचना सत्यापित करें अपने पसंदीदा ग्राहक के साथ सही है।
  • संयुक्त भंडारों के लिए एक डंप फ़ाइल बनाएं।
  • अनुरोध करें कि प्रदाता इस डंप फ़ाइल से एक नया भंडार पॉप्युलेट करे।

YMMV: यह एक उचित दृष्टिकोण प्रतीत हो रहा है, लेकिन मैं इस तरह एक तीसरी पार्टी के प्रदाता के साथ काम नहीं किया है।

+0

कि आखिरी बिट बस मैं था बाद! जब मैं इसे पढ़ता था तो मैं बस अपनी संभावनाओं को छोड़ने वाला था। धन्यवाद। – nickf

+0

यदि आपका सबवर्जन होस्टर विवर्तन 1.4 या बाद में उपयोग करता है तो आप हमेशा स्थानीय भंडार में भंडार को svnsync और (सिंक्रनाइज़ करने के बाद) डेटाबेस को डंप कर सकते हैं। –

+1

और कुछ उपवर्तन प्रदाता (जैसे Google कोड) svnsyncing/to/a repository को अनुमति देते हैं। तो आप कहीं और विलय करने के बाद वहां svnsync के साथ परिणाम अपलोड कर सकते हैं। –

8

हाँ, svnadmin dump और svnadmin load का उपयोग कर।

चलो मान लें कि आपके खजाने, प्रमुख संशोधन 100 के साथ एक और प्रमुख संशोधन के साथ अन्य 150

आप पहले भंडार डंप और नया एक में लोड करने के लिए है कि: आप में से पूरी कहानी के साथ खत्म पहला भंडार, संशोधन 0 से संशोधन 150 तक।

फिर आप दूसरे भंडार को डंप करते हैं और इसे नए में लोड करते हैं: यह अपने पूर्ण इतिहास से भरा हुआ है, केवल एक ही चीजें जो वास्तविक संशोधन संख्याएं बदलती हैं। दूसरे भंडार का इतिहास संशोधन 151 से 250 के संशोधन के लिए नए भंडार में दर्शाया जाएगा।

दोनों भंडारों का पूरा इतिहास संरक्षक है, केवल पुनरीक्षण संख्या दूसरे के लिए आयात की गई भंडार के लिए बदलती है।

निश्चित रूप से एक ही दो से अधिक खजाने के लिए लागू होता है।

संपादित करें: मैं पोस्ट ने संपादित करते समय, तो मैं अपने नोट ...

+1

बस एक त्वरित नोट - ऐसा लगता है कि जब आप अपनी टिप्पणी लिख रहे थे तो कुछ इतालवी फिसल गए थे। यह "और" होना चाहिए, "ई" :-) –

+0

एहे, आप सही हैं, कभी-कभी मेरी इतालवी उंगलियों की तरह मेरे प्रयास-से-अंग्रेजी-अंग्रेजी दिमाग से अधिक तेज़ हो सकता है: डी –

2

यदि आपके पास svnadmin तक पहुंच नहीं है, तो यह कठिन लेकिन काम करने योग्य होगा। आइए मान लें कि आपके पास रिपॉजिटरीज ए और बी है, और उन्हें रिपोजिटरी सी में विलय करना चाहते हैं। यहां दिए गए चरणों को पूरा करने के लिए आपको उपयोग करना होगा।

  1. अपनी हार्ड डिस्क पर भंडार एक में संशोधन 1 की जाँच करें।

  2. अपनी सी रिपोजिटरी की रूट पर Repository_A नामक एक निर्देशिका बनाएं, और इसे अपनी स्थानीय हार्ड डिस्क पर देखें।

  3. रिपोजिटरी_ए फ़ोल्डर में सी के चेकआउट में, एएस (शून्य) एसएसएन फाइलों से आपकी जांच से फ़ाइलों की प्रतिलिपि बनाएँ।

  4. एक सी

अद्यतन संशोधन करने के लिए 2 भंडार एक की अपने काम की नकल पर कमिट प्रदर्शन करना, और चरण 3 और 4 करते हैं, और प्रत्येक उत्तरोत्तर संशोधन के साथ दोहराने जब तक आप सिर तक पहुँचते हैं।

अब svnadmin की आवश्यकता के बिना, बी

यह मूलतः एक ही रूप में @Davide Gualano सुझाव दे रहा था क्या करना होगा साथ भी ऐसा ही। यदि आप बहुत सारे संशोधन नहीं कर रहे हैं, तो आप शायद यह करने के लिए एक साधारण स्क्रिप्ट लिख सकते हैं, आप इसे मैन्युअल रूप से कर सकते हैं।

+0

हां, अंतिम परिणाम svnadmin डंप और लोड का उपयोग कर समाधान के समान होगा, लेकिन यह काफी समय लेगा। –

+0

अंतिम परिणाम थोड़ा अलग मेटाडेटा होगा। सभी बदलावों को एक डेवलपर द्वारा थोड़े समय के दौरान चेक किया जाएगा। टिप्पणियों में चेक की प्रतिलिपि बनाने के लिए आपको अपनी स्क्रिप्ट प्राप्त करने के लिए भी चालाक होने की आवश्यकता होगी। –

9

सबवर्सन 1.7 के साथ, अब आप दूरस्थ रूप से डंप करने में सक्षम हैं। यही है, स्थानीय फ़ाइल सिस्टम और svnadmin dump कमांड तक पहुंच के बिना।

आप रिमोट रिपोजिटरी का पूरा डंप प्राप्त करने के लिए svnrdump का उपयोग कर सकते हैं। वाक्यविन्यास विवरण के लिए प्रलेखन देखें।

ध्यान दें कि सर्वर को 1.7, केवल क्लाइंट चलाने की आवश्यकता नहीं है।

http://svnbook.red-bean.com/en/1.7/svn.ref.svnrdump.c.dump.html

+0

svn 1.4 से शुरू करना आप रिमोट रिपोजिटरी की स्थानीय प्रतिलिपि बनाने के लिए svnsync का भी उपयोग कर सकते हैं। https://svn.apache.org/repos/asf/subversion/trunk/notes/svnsync.txt –

1

इस प्रश्न के लिए अन्य उत्तर नीचे स्क्रिप्ट बनाने के लिए मुझे सक्षम होना चाहिए। अपने मामले के लिए REPOS मानचित्र अनुकूलित करें। साथ ही, आप सीधे नई शाखाओं और ट्रंक में सीधे "स्थिर" निर्देशिका में टैग और शाखाओं को स्थानांतरित करना चाहते हैं।

#!/bin/bash 

NEWREPO=$(pwd)/newrepo 
NEWREPOCO="${NEWREPO}_co" 
DUMPS=repodumps 
REV="0:HEAD" 
REPOROOT=/data/svn/2.2.1/repositories/ 
TOOLDIR=/opt/svn/2.2.1/bin/ 
PATH=${PATH}:${TOOLDIR} 

# Old Repository mapping 
declare -A REPOS=( 
    [BlaEntityBeans]='(
     [newname]="EntityBeans" 
    )' 
    [OldServletRepoServlet]='(
     [newname]="SpreadsheetImportServlet" 
    )' 
    [ExperimentalMappingXML]='(
     [newname]="SpreadsheetMappingXML" 
    )' 
    [NewImportProcess]='(
     [newname]="SpreadsheetImportProcess" 
    )'  
) 

dump() { 
    rm -fr ${DUMPS} 
    mkdir ${DUMPS} 
    for repo in "${!REPOS[@]}" 
    do 
     local dumpfile=${DUMPS}/${repo}.dmp 
    echo "Dumpimg Repo ${repo} to ${dumpfile}" 
     svnadmin dump -r ${REV} ${REPOROOT}/${repo} > ${dumpfile} 
    done 
} 

loadRepos() { 
    # new big repo 
    rm -fr ${NEWREPO} 
    svnadmin create ${NEWREPO} 
    svn mkdir file:///${NEWREPO}/trunk -m "" 
    svn mkdir file:///${NEWREPO}/branches -m "" 
    svn mkdir file:///${NEWREPO}/tags -m "" 

    # add the old projects as modules 
    for currentname in "${!REPOS[@]}" 
    do 
     declare -A repo=${REPOS[$currentname]} 
     local newname=${repo[newname]} 
     echo "Loading repo ${currentname} soon to be ${newname}" 
     dumpfile=${DUMPS}/${currentname}.dmp 

     # import the current repo into a trmporary root position 
     svn mkdir file:///${NEWREPO}/${currentname} -m "Made module ${currentname}" 
     svnadmin load --parent-dir ${currentname} ${NEWREPO} < ${dumpfile} 

     # now move stuff arround 
     # first rename to new repo 
     svn move file:///${NEWREPO}/${currentname} file:///${NEWREPO}/${newname} -m "Moved ${currentname} to ${newname}" 
     # now move trunk, branches and tags 
     for vc in {trunk,branches,tags} 
     do 
      echo "Moving the current content of $vc into ${NEWREPO}/${vc}/${newname}" 
      svn move file:///${NEWREPO}/${newname}/${vc} file:///${NEWREPO}/${vc}/${newname} -m "Done by $0" 
     done 
    svn rm file:///${NEWREPO}/${newname} -m "Removed old ${newname}" 
    done 
} 

dump 
loadRepos 
3

आप निम्न चरणों के साथ एक संग्रह में कई डंप फ़ाइलों को लोड कर सकते हैं।

भंडार जड़:

projectA 
    branches 
    tags 
    trunk 
projectB 
    branches 
    tags 
    trunk 

सबसे पहले आप इस तरह अपने भंडार जड़ में निर्देशिका (परियोजना ए, परियोजना बी) बनाना चाहिए:

$ svn mkdir -m "Initial project root" \ 
file:///var/svn/repository_root/Project_A\ 
file:///var/svn/repository_root/Project_B\ 
file:///var/svn/repository_root/Project_C\ 

Revision 1 committed. 

और उसके बाद आप अपने डंप फ़ाइलों लोड कर सकते हैं :

उपयोग पैरामीटर --parent-dir DIRECTORY

$ svnadmin load /var/svn/repository_root --parent-dir Project_A < file-dump-PRJA.dump 
… 
$ svnadmin load /var/svn/repository_root --parent-dir Project_B < file-dump-PRJB.dump 

इस तरह आपके पास एक भंडार होगा जिसमें कई डंप किए गए भंडार होंगे।

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