कैसे एक तोड़फोड़ भंडार से अंतिम n संशोधन के लिए git-svn क्लोन करें?


314

मुसीबत

आप एक तोड़फोड़ के साथ एक उथले प्रतिलिपि कैसे बना सकते हैं एक तोड़फोड़ रिपॉजिटरी से git-svn, जैसे कि आप केवल पिछले तीन संशोधनों को कैसे खींचते हैं?

git cloneआदेश एक Git रिपोजिटरी से पिछले n संशोधन प्राप्त कर सकते हैं अगर आप विकल्प का उपयोग --depth, आप भंडार की एक उथले प्रतिलिपि प्राप्त अर्थात्। उदाहरण:

git clone --depth 3 git://some/repo myshallowcopyrepo

क्या git-svn के लिए समान विकल्प है?

मेरी अब तक की खोजें

अब तक मैंने केवल -rNविकल्प ढूंढा Nहै कि रिवीजन कहां करना है। उदाहरण:

git svn clone -rN svn://some/repo

प्रलेखन के अनुसार उपयोग करने की संभावना है -r$REVNUMBER:HEAD। मैंने पिछले 3 संशोधनों को प्राप्त करने के लिए निम्नलिखित प्रयास किया जो एक त्रुटि संदेश लौटाता है।

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

इसलिए मैंने HEAD~3तीसरे लेकिन अंतिम संशोधन 534 की वास्तविक संख्या के साथ प्रतिस्थापित किया। यह काम किया, लेकिन इसके लिए मुझे पहले तीसरे की अंतिम संख्या का पता लगाने की आवश्यकता है, लेकिन अंतिम प्रतिबद्ध है।

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

प्रलेखन

Git क्लोन

Git-SVN


6
मेरे स्वयं के प्रश्न का उत्तर देना: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(लेकिन मेरे लिए काम नहीं किया)
सेबेस्टियन ग्रिग्नोली

कितना मुश्किल इसे लागू किया जाएगा --depthके लिए git svn, के बाद से समर्थन पहले से ही वहाँ है। और यह पहले से ही सर्वर से नवीनतम रेव का पता लगाना है?
पीटर कॉर्डेस

जवाबों:


238

आपने पहले ही Git-SVN में उथले क्लोन को निर्दिष्ट करने का सबसे सरल तरीका खोज लिया है, उस SVN संशोधन संख्या को निर्दिष्ट करके जिसे आप अपना क्लोन शुरू करना चाहते हैं ( -r$REV:HEAD)।

उदाहरण के लिए: git svn clone -s -r1450:HEAD some/svn/repo

गिट की डेटा संरचना एक निर्देशित एसाइक्लिक ग्राफ (डीएजी) में पॉइंटर्स पर आधारित है, जो कम आवागमन को चलाने के लिए तुच्छ बनाता nहै। लेकिन SVN में (और इसलिए Git-SVN में) आपको खुद ही रिविजन नंबर ढूंढना होगा।


5
क्या होगा अगर मैं भविष्य में पहले के संशोधन को जारी रखना चाहता हूं, क्या यह संभव है?
ज़ेनिचीमारो

5
@ ज़ेनिचिमारो: आप ऐसा कर सकते हैं कि एक git-svnही स्थान पर एक और रिमोट इंगित करके और git-svn fetchपेड़ का अधिक उपयोग कर सकते हैं। उस बिंदु पर आपको git filter-branchपुराने (आंशिक) पेड़ को दाहिनी शाखा पर पुन: स्थापित करने के लिए उपयोग करना होगा।
बेन जैक्सन

पॉल वहाँ मुझे Git (करने के लिए SVN से वृद्धिशील प्रवासन प्रदर्शन से नवीनतम संशोधन पाने के लिए किसी भी तरह से है stackoverflow.com/questions/29161646/... )
SabareeshSS

1
एसवीएन संशोधनों की पहचान करने के लिए लगातार पूर्णांक का उपयोग करता है, जिससे वापस चलने के लिए और भी तुच्छ हो जाता nहै ...
हार्मिक

मुझे लगता है कि आर के बाद एक जगह गायब है। उदाहरण के लिए git svn clone -r 1133: HEAD some / svn / repo
Gnana

92

मुझे लगता है कि हमारे विशाल तोड़फोड़ के पेड़ (हम जल्द ही svn संशोधन 35000 तक पहुँच रहे हैं) से बाहर सीमित संख्या में संशोधन प्राप्त करने के लिए अक्सर निम्नलिखित का उपयोग कर पाते हैं।

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

और यह पता लगाने का एक अच्छा तरीका है कि एक शाखा कहाँ से शुरू हुई है, svn logइसे करने के लिए और शाखा पर पहला पता लगाने के लिए (पिछले एक ऐसा करने से सूचीबद्ध):

svn log --stop-on-copy svn://some/repo/branch/some-branch

अब तक मुझे वास्तव में सभी शाखाओं को ट्रैक करने में इसके लायक परेशानी नहीं मिली है। क्लोन और svn में बहुत अधिक समय लगता है और git एक साथ उतना अच्छा काम नहीं करता जितना मैं चाहूंगा। मैं पैच फाइलें बनाता हूं और उन्हें एक और svn शाखा के git क्लोन पर लागू करता हूं।


1
+1 से - मुझे एक गोल करने में मदद मिली 128 अंक मैं एक पूरे svn रेपो क्लोनिंग कर रहा था
इयान ऑक्सले

svn लॉग कमांड वास्तव में वही था जिसकी मुझे तलाश थी! धन्यवाद
mrbrdo

1
मैं जो गैर-मानक ब्रांचिंग और लेआउट है, उसके साथ काम करता हूं, इसलिए मैं आमतौर पर प्रत्येक एसवीएन शाखा के लिए एक स्थानीय गिट रेपो बनाता हूं, और फिर cherry-pick/ rebaseउन लोगों के बीच। कमिट एक अतिरिक्त कदम उठाती है ( pushफिर dcommit, रिमोट रेपो से), लेकिन मुझे लगता है कि यह ट्रेडऑफ के लायक है।
क्रोनोस्पून

के बारे में सोचा नहीं था, हो सकता है कि आप केवल विशिष्ट टैग / शाखाओं को क्लोन कर सकते हैं: जैसा कि आप कहते हैं :)
VeenarM

33

... 7 साल बाद, रेगिस्तान में, एक तूफ़ानी विस्फोट से ...

मैं स्वीकृत उत्तर से संतुष्ट नहीं था इसलिए मैंने आपके लिए गिथब पर उपलब्ध करने के लिए कुछ स्क्रिप्ट बनाई । इनका उपयोग किसी ऐसे व्यक्ति की मदद करना चाहिए जो git svn cloneसंपूर्ण रिपॉजिटरी का क्लोन बनाना नहीं चाहता है और इतिहास के मध्य से क्लोन करने के लिए एक विशिष्ट संशोधन का शिकार नहीं करना चाहता है (हो सकता है कि आप रेपो का एक गुच्छा क्लोन कर रहे हों)। यहां हम केवल अंतिम एन संशोधनों को क्लोन कर सकते हैं:

git svn cloneअंतिम 50 संशोधनों को क्लोन करने के लिए उपयोग करें

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

SVN रेपो से पिछला N संशोधन खोजें

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

यह एक दरार देगा, हमारे रेपो में लगभग 170,000 संशोधन हैं और यह एक परियोजना को करने के लिए बहुत लंबा समय ले रहा है, और मेरे पास रेपो में 10 से अधिक विशिष्ट परियोजनाएं हैं: केवल 3-4 साल के इतिहास को ध्यान में रखते हुए।
वीएनएमआर

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