मैं एक svn कैसे रख सकता हूं: git-svn का उपयोग कर बाहरी अद्यतित?




version-control dvcs (6)

एक एसवीएन रेपो के रूप में मेरा भंडार का इलाज, मुझे मिलता है:

svn co http://myrepo/foo/trunk foo
...
foo/
  bar/
  baz/ -> http://myrepo/baz/trunk

इसे एक गिट रेपो के रूप में पेश करते हुए, मुझे मिलता है:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
  bar/

मैं अपने स्थानीय मशीन पर कहीं और बज़ क्लोन कर सकता हूं और एक सिम्लिंक जोड़ सकता हूं, लेकिन यह सिर्फ एक हैक है। क्या git svn rebase स्वचालित रूप से उन परिवर्तनों को खींचने का कोई तरीका है जब यह सब कुछ अपडेट करता है, जैसे svn up करता है?


इस पायथन स्क्रिप्ट https://bitbucket.org/nytmyn/gitsvnext/overview

अपने गिट भंडार में निम्नलिखित svn बाहरी चलाने के लिए जाँच करें

python /../gitsvnext/run update

यह जानने के लिए चलाएं कि क्या करना है। git / info / extrae

python /../gitsvnext/run list

मेरे द्वारा उपयोग किए जाने वाले समाधान को मेरे स्थानीय बॉक्स पर अन्य git-svn क्लोन के लिए सिम्लिंक करना था। यह बहुत अच्छी तरह से काम करता है: यह मुझे बदलाव वापस करने की इजाजत देता है, और यह मुझे प्रोजेक्ट ए में स्थानीय परियोजनाओं को परियोजना बी में लाने के लिए अनुमति देता है।


मैंने अभी एक छोटी सी लिपि लिखी है जो सभी svn:externals मौजूदा HEAD svn:externals रूट को रूट निर्देशिका में चेकआउट करता है और उन्हें गिट रिपोजिटरी से बाहर करता है।

इसे .git/hooks/post-checkout और जब भी कार्यरत पेड़ बदल जाए, तो यह उन बाहरी चेकआउट को अद्यतित रखेगा, उदाहरण के लिए git svn rebase या git-checkout

#!/bin/bash
set -eu

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
    while read checkout_args
    do
        checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
        svn checkout ${checkout_args}
        if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
        then
            echo ${checkout_dirname} >> .git/info/exclude
        fi
    done
}

मैंने एक स्क्रिप्ट भी बनाई (दोनों पर्ल और रुबी वेरिएंट उपलब्ध हैं) जो मेरे लिए यह करती हैं, यह http://github.com/liyanage/git-tools/

  • सभी svn: externals को दोबारा जांचता है
  • एक बड़े भंडार के क्लोन आधा रास्ते के माध्यम से बार-बार चलाया जा सकता है। मुझे बहुत कुछ हुआ। यह उठाता है जहां यह छोड़ दिया।
  • सभी svn जोड़ता है: बाहरी प्रविष्टियां जो इसे पाती हैं और प्रक्रिया करती हैं .git / info / includee
  • सभी svn जोड़ता है: प्रविष्टियों को अनदेखा करें जो इसे प्राप्त करते हैं .git / info / बहिष्कृत करें
  • Svn करने के पहले रन के बाद नियमित रूप से चलाया जा सकता है: सभी क्लोन उप-सैंडबॉक्स में रीबेस, नए बाहरी और नए svn खोजें: अनदेखा

अद्यतन: मैं अब इस स्क्रिप्ट को बनाए रख रहा हूं। एक एसवीएन रिपोजिटरी के साथ-साथ अन्य गिट-संबंधित विशेषताओं को दोबारा क्लोनिंग और अपडेट करने की इसकी कार्यक्षमता, इस नई परियोजना में उपलब्ध है कि मैं सक्रिय रूप से बनाए रख रहा हूं: http://liyanage.github.com/git-tools/


मैंने देखा है कि गिट-एसवीएन के साथ svn externals को एकीकृत करने का सबसे अच्छा माध्यम यह script , जो आपके बाहरी को .git_externals / निर्देशिका में क्लोन करता है और सिम्लिंक बनाता है और आपको आवश्यक फ़ाइलों को बहिष्कृत करता है। मुझे यह एक सरल और सीधा समाधान मिल गया है। YMMV।

Git-svn के साथ svn externals से निपटने के लिए अन्य विकल्पों का पुराना अवलोकन यहां दिया गया है। मेरे लिए वे थोड़ी अधिक जटिल और बाद के गिट उपयोग के तहत तोड़ने के लिए उत्तरदायी दिखते हैं।


सिर्फ रिकॉर्ड के लिए: मैंने this सुझाव का पालन किया और svn:externals निपटने के लिए SmartGit का उपयोग करने का SmartGit किया।

स्मार्टगिट अब तक का सबसे अच्छा जीयूआई क्लाइंट है जिसे मैंने कभी गिट के लिए देखा है। svn:externals बारे में, यह न केवल उन्हें सही ढंग से लाता है, बल्कि बाह्य भंडारों के "फास्ट स्नैपशॉट" (केवल पढ़ने के लिए, केवल-केवल क्लोन) करने का विकल्प प्रस्तुत करता है।

दुर्भाग्यवश यह वाणिज्यिक उपयोग के लिए स्वतंत्र नहीं है (और मुझे लाइसेंस की कीमत थोड़ी अधिक है - हाँ, मैं एक cheapskate हूँ)। इसका उपयोग गैर वाणिज्यिक उद्देश्यों के लिए मुफ्त में किया जा सकता है।





dvcs