मैं एसवीएन प्रतिबद्ध कैसे वापस कर सकता हूं?


303

मुझे इस बात के विभिन्न उदाहरण मिले हैं कि SVN को कैसे बदला जाए

svn merge -r [current_version]:[previous_version] [repository_url]

या

svn merge -c -[R] .

लेकिन दोनों में से कोई भी काम नहीं करता है। मैंने उन कमांड्स को आज़माया और उन फाइलों को चेक किया जो हाथ से बदल गई थीं।

मैं संशोधन संख्या 1944 के साथ एक कमिट कैसे वापस करूँ? मैं कैसे जांच सकता हूं कि रिवर्ट किया गया है (परिवर्तनों को वास्तविक फ़ाइल में देखे बिना वापस कर दिया गया है)?


16
क्या आपने कभी उत्तर स्वीकार नहीं किया क्योंकि उनमें से किसी ने भी काम नहीं किया?
2rs2ts

4
यदि आप एक शाब्दिक उत्तर चाहते हैं, तो "svn मर्ज -c -1944।" यह जाँचने के लिए कि क्या यह काम कर रहा है: "svn diff"
जॉन सैम्पसन



क्या होगा अगर केस, मेरे पास 1943 (अच्छी कमिटमेंट) है, तो 1944 (खराब कमिट), फिर 1945 (अच्छी कमिट), फिर 1946 (अच्छी कमिट) है। अब मैं केवल १ ९ ४४ (खराब प्रतिबद्ध) को हटाना चाहता हूं और १ ९ ४४ के बाद सभी संशोधन रखना चाहता हूं, इसका मतलब मैं इन सभी संशोधन से १ ९ ४३,१ ९ ४५,१ ९ ४६ (केवल १ ९ ४४ हटा) जैसा परिणाम चाहता हूं, मुझे क्या करना चाहिए ??
भाविनी_

जवाबों:


447

दोनों उदाहरणों को काम करना चाहिए, लेकिन

svn merge -r UPREV:LOWREV . पूर्ववत श्रेणी

svn merge -c -REV . पूर्ववत एकल संशोधन

इस वाक्यविन्यास में - यदि वर्तमान dir WC है और (जैसा कि प्रत्येक मर्ज के बाद किया जाना चाहिए) आप परिणाम करेंगे

क्या आप लॉग देखना चाहते हैं?


9
@dwjohnston - हाँ, मर्ज हमेशा WC में किया जाता है और यह सर्वर-साइड कार्य नहीं है
Lazy Badger

14
svn: Merge source required। कोई पाँसा नहीं।
2rs2ts

27
@ 2rs2ts ऐसा लगता है कि आप 'वर्तमान निर्देशिका में ऐसा करने के लिए' ट्रेलिंग डॉट को भूल गए।
दलिन

14
आप एक ही समय में कई एकल काम भी कर सकते हैं:svn merge -c -42587,-42589 .
18

1
@ahnbizcad - संशोधन (एकल), जिसे आप पूर्ववत करना चाहते हैं
आलसी बेजर

130

यदि आप TortoiseSVN क्लाइंट का उपयोग कर रहे हैं , तो यह आसानी से शो लॉग डायलॉग के माध्यम से किया जाता है ।


5
यह अब तक का सबसे आसान तरीका है
मार्ककु के।

5
यह पुराना है। वर्तमान संस्करण में क्लाइंट के लिए अब कोई संदर्भ-मेनू उपलब्ध नहीं है।
user1789573

19
क्या? TortoiseSVN एक संदर्भ मेनू है, साथ ही यह संवाद भी पैदा करता है। "अब कोई संदर्भ मेनू नहीं है" से आपका क्या तात्पर्य है? वहाँ सबसे निश्चित रूप से है!
बेन

@ मुझे लगता है कि उपयोगकर्ता 1789573 जवाब में जुड़े ट्यूटोरियल में "संदर्भ मेनू" के स्पष्ट उल्लेख पर थोड़ा फंस गया था।
टॉम कैटुलो

2
यदि आप इसे बाद में देख रहे हैं, तो यह (अभी भी) है। शो लॉग स्क्रीन में, संशोधन पर राइट क्लिक करें और एक "रिवर्ट टू दिस रिविजन" विकल्प है। यह TortoiseSVN 1.9.4 बिल्ड 27285 में है। मैंने अभी इसका इस्तेमाल किया है और आपको बता सकता है कि यह ठीक काम करता है।
ब्रूस वान हॉर्न

64

svn merge -r 1944:1943 .अपनी कार्य प्रति में r1944 के परिवर्तनों को वापस करना चाहिए। फिर आप अपनी कार्यशील प्रति (बदलाव के साथ) में परिवर्तनों की समीक्षा कर सकते हैं, लेकिन रिपॉजिटरी में रिवर्ट को लागू करने के लिए आपको प्रतिबद्ध होने की आवश्यकता होगी।


4
काम नहीं करता है, मर्ज स्रोत की आवश्यकता है। svn merge -r 1944:1943 .इसके बजाय कोशिश की , लेकिन कुछ भी नहीं बदला है।
एलेक्स

क्या r1944 से रिपॉजिटरी उन्नत हुई है? यदि हां, तो क्या r1943 और r1944 के बीच के परिवर्तनों के समान ही परस्पर विरोधी परिवर्तन हैं?
onon15

मैं १ ९ ४५ में संशोधन कर रहा हूं और इसमें कोई विरोध नहीं है। न तो svn statusहै और न ही svn diffकुछ भी देता है।
एलेक्स

7
त्रुटि:svn: Try 'svn help' for more info svn: Merge source required
एलेक्स

5
लेकिन svn merge -r 1945:1943 .लगता है काम कर लिया है। मुझे लगता है कि मैं समझता हूं: आपको अपने कामकाजी भंडार में 'खराब' होने से पहले संस्करण को 'मर्ज' करने की जरूरत है। यह ठीक है जब आप पिछली प्रतिबद्ध का एक सरल 'रिवर्ट' करना चाहते हैं। लेकिन क्या होगा अगर आप संस्करण 1900 के साथ किए गए परिवर्तनों को वापस लेना चाहते हैं?
एलेक्स

44

सबसे पहले, काम की प्रतिलिपि को 1943 में वापस कर दें।

> svn merge -c -1943 .

दूसरा, जाँच करें कि क्या होने वाला है।

> svn status

तीसरा, प्रतिबद्ध संस्करण 1945।

> svn commit -m "Fix bad commit."

चौथा, नए लॉग को देखें।

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
क्या होगा अगर केस, मेरे पास 1943 (अच्छी कमिटमेंट) है, तो 1944 (खराब कमिट), फिर 1945 (अच्छी कमिट), फिर 1946 (अच्छी कमिट) है। अब मैं केवल १ ९ ४४ (खराब प्रतिबद्ध) को हटाना चाहता हूं और १ ९ ४४ के बाद सभी संशोधन रखना चाहता हूं, इसका मतलब मैं इन सभी संशोधन से १ ९ ४३,१ ९ ४५,१ ९ ४६ (केवल १ ९ ४४ हटा) जैसा परिणाम चाहता हूं, मुझे क्या करना चाहिए ??
Bhavin_m

26

किसी संशोधन को "रि-कंप्लीट" करना असंभव है, लेकिन आप अपनी वर्किंग कॉपी को 1943 के वर्जन पर वापस ला सकते हैं और 1945 के वर्जन के रूप में कमिट कर सकते हैं। 1943 और 1945 के वर्जन एक जैसे होंगे, प्रभावी रूप से बदलावों को वापस लाएंगे।


18
बस झुंझलाहट सटीक होने के लिए, मैं यह टिप्पणी करूंगा कि यदि आपके पास रिपॉजिटरी तक व्यवस्थापक की पहुंच है, तो आप "अनलमिटेड" कर सकते हैं। यह एक दिए गए संशोधन का उपयोग करके svn dumpऔर फिर एक क्लोन रिपोजिटरी बनाकर svn load। लेकिन, निश्चित रूप से, इसका उपयोग सामान्य परिस्थितियों में नहीं किया जाना चाहिए।
onon15

4
मैं कोई समस्या नहीं करना चाहता, मैं एक निश्चित प्रतिबद्ध के साथ एक नया प्रतिबद्ध नंबर बनाना चाहता हूं। सेट्स का कहना है कि मैंने 1944 के संस्करण की जाँच की है, 1945 में एक कमिट किया, जिसे मैं 'रिवर्ट' करना चाहता हूँ। फिर मैं एक संस्करण १ ९ ४६ चाहता हूं, जिसकी फाइलें १ ९ ४४ के संस्करण के समान हैं। (पाठ्यक्रम के इतिहास को छोड़कर)। लेकिन सवाल यह है कि: कैसे करें? आज्ञा क्या हैं?
एलेक्स

//, @ एलेक्स, मुझे इसमें दिलचस्पी है, विशेष रूप से कुछ अनुरूप में $ git revert। मैंने कुछ समय के लिए Git का उपयोग करने के बाद SVN सीखना कुछ कठिन पाया है।
नाथन बसानी 20

9

जैसा कि यह कहते हैं, निम्नलिखित एक सूखा रन करेगा। HEAD वर्तमान संस्करण है, PREV पिछले है, फिर आपकी फ़ाइल का पथ, या प्रतिबद्ध आइटम:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

यदि ड्राई रन अच्छा लगता है, तो कमांड को बिना -Dry-run के चलाएं

संशोधन और पुन: प्रतिबद्ध में परिवर्तन की पुष्टि करें। संस्करण संख्याओं के लिए ब्राउज़ करने का प्रयास करें:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

क्या यह स्थानीय प्रतिलिपि को खराब संशोधन से अलग होने की आवश्यकता है?
एलीएजर मिरोन


2

जबकि पहले से दिए गए सुझाव कुछ लोगों के लिए काम कर सकते हैं, यह मेरे मामले के लिए काम नहीं करता है। मर्ज करते समय, rev 1443अपडेट करने वाले उपयोगकर्ता rev 1445अभी भी मर्ज से 1444बराबर होने के बावजूद सभी फ़ाइलों को बदल देते हैं 1443। मुझे अपडेट देखने के लिए अंत उपयोगकर्ताओं की आवश्यकता थी।

यदि आप प्रतिबद्ध को पूरी तरह से छिपाना चाहते हैं, तो सही संशोधन पर एक नई शाखा बनाना और फिर शाखाओं को स्वैप करना संभव है। केवल एक चीज आपको सभी तालों को हटाने और फिर से जोड़ने की आवश्यकता है।

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

यह मेरे लिए काम करता है, शायद यह किसी और के लिए उपयोगी होगा =)


2
svn merge -c -M PATH

इससे मेरी जान बच गई।

मेरे पास एक ही मुद्दा था, वापस लौटने के बाद भी मुझे पुराना कोड दिखाई नहीं दे रहा था। उपरोक्त कमांड चलाने के बाद मुझे एक पुराना पुराना वर्जन कोड मिला।


1

मैंने ऊपर की कोशिश की, ( svn merge) और आप सही हैं, यह जैक करता है। तथापि

svn update -r <revision> <target> [-R]

काम करने लगता है, लेकिन स्थायी नहीं है (मेरा svn केवल एक पुराना संशोधन दिखा रहा है)। इसलिए मुझे करना पड़ा

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

मेरे विशेष मामले में मेरा लक्ष्य है interfaces/AngelInterface.php। मैंने फ़ाइल में परिवर्तन किए, उन्हें प्रतिबद्ध किया, बिल्ड कंप्यूटर को अपडेट किया, phpdoc संकलक को चलाया और पाया कि मेरे परिवर्तन समय की बर्बादी थे। svn log interfaces/AngelInterface.phpमेरे परिवर्तन को r22060 के रूप में दिखाता है और उस फ़ाइल पर पिछली प्रतिबद्धता r22059 थी। इसलिए मैं कर सकता हूं svn update -r 22059 interfaces/AngelInterface.phpऔर मैं कोड के साथ समाप्त हो गया क्योंकि यह -r22059 फिर से था। फिर :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

वैकल्पिक रूप से मैं एक निर्देशिका पर एक ही काम कर सकता था, उपरोक्त सभी के . -Rस्थान पर निर्दिष्ट करके interfaces/AngelInterface.php


1
एक अन्य बात, जैसा कि पहले ही कहा गया था, जो आप नहीं कर सकते, उसे इतिहास से हटा दें, जैसे आप सीधे हैक करके जीआईटी को हैक कर सकते हैं। आप केवल इतना कर सकते हैं, अपने स्रोत को बदलने के लिए रिपॉजिटरी का उपयोग करें कि आप इसे कैसे इरादा करते हैं, और परिवर्तन के रूप में प्रतिबद्ध हैं।
सिबज

आगे जांच करने पर मैं देख सकता हूं कि svnadmin का उपयोग करके इतिहास से प्रतिबद्ध को हटाना संभव है, लेकिन आपको इसके खिलाफ दृढ़ता से सलाह दी जाती है। देखें stackoverflow.com/questions/5566327/...
sibaz

0

यदि आप इतिहास से कमिट्स को पूरी तरह से हटाना चाहते हैं, तो आप रेपो के डंप को एक विशिष्ट संशोधन पर भी कर सकते हैं, फिर उस डंप को आयात करें। विशेष रूप से:

svnrdump dump -r 1:<rev> <url> > filename.dump

Svnrdump कमांड svnadmin डंप के समान कार्य करता है लेकिन रिमोट रेपो पर काम करता है।

इसके बाद बस अपनी पसंद के रेपो में डंप फ़ाइल आयात करें। यह बीनस्टॉक पर अच्छी तरह से काम करने के लिए परीक्षण किया गया था।

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