2012-11-11 12 views
231

मैं पाया है कि कैसे एक SVN वापस लौटने के लिए के विभिन्न उदाहरणमैं एक एसवीएन प्रतिबद्ध कैसे वापस कर सकता हूं?

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

या

svn merge -c -[R] . 

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

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

+11

क्या आपने कभी जवाब स्वीकार नहीं किया क्योंकि उनमें से कोई भी काम नहीं करता था? – 2rs2ts

+8

आलसी बैजर का जवाब स्वीकार किया जाना चाहिए। – Jeff

+4

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

उत्तर

38

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

+4

काम नहीं करता है, मर्ज स्रोत की आवश्यकता है। कोशिश की 'svn merge -r 1 9 44: 1 9 43।' इसके बजाए, लेकिन कुछ भी नहीं बदला है। – Alex

+0

क्या आर 1 9 44 के बाद से भंडार उन्नत है? यदि हां, तो क्या आर 1 9 43 और आर 1 9 44 के बीच के बदलावों के समान ही विरोधाभासी परिवर्तन हैं? – onon15

+0

मैं संशोधन 1 9 45 में हूं और ऐसा कोई संघर्ष प्रतीत नहीं होता है। न तो 'svn status' और न ही' svn diff' कुछ भी देता है। – Alex

23

एक संशोधन को "असामान्य" करना असंभव है, लेकिन आप अपनी कार्यशील प्रतिलिपि संस्करण 1 9 43 में वापस कर सकते हैं और संस्करण 1 9 45 के रूप में इसे स्वीकार कर सकते हैं। 1 9 43 और 1 9 45 के संस्करण समान होंगे, प्रभावी रूप से परिवर्तनों को वापस कर देंगे।

+17

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

+4

मैं असामान्य नहीं करना चाहता, मैं एक निश्चित प्रतिबद्धता के साथ एक नया प्रतिबद्धता संख्या बनाना चाहता हूं। सेट्स का कहना है कि मैंने संस्करण 1 9 44 की जांच की है, 1 9 45 में एक प्रतिबद्धता बनाई है, जिसे मैं 'वापस' करना चाहता हूं। तब मैं संस्करण 1 9 46 रखना चाहता हूं, जिनकी फाइलें संस्करण 1 9 44 में समान हैं। (पाठ्यक्रम के इतिहास को छोड़कर।) लेकिन सवाल बनी हुई है: यह कैसे करें? आदेश क्या हैं? – Alex

+0

//, @ एलेक्स, मुझे इसमें भी रूचि है, विशेष रूप से '$ git revert' के समान कुछ में। मुझे इतने लंबे समय तक गिट का उपयोग करने के बाद एसवीएन सीखना मुश्किल हो गया है। –

361

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

svn merge -r UPREV:LOWREV . पूर्ववत रेंज

svn merge -c -REV . इस वाक्य में एक संशोधन

पूर्ववत - यदि वर्तमान dir WC और (हर मर्ज के बाद किया होगा के रूप में) आप है ' परिणाम

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

+2

क्या आपको ऐसा करने के लिए एक कार्यशील प्रतिलिपि में होना चाहिए? – dwjohnston

+8

@dwjohnston - हाँ, विलय ** हमेशा डब्ल्यूसी ** में प्रदर्शन किया जाता है और यह सर्वर-साइड कार्य नहीं है –

+12

'svn: आवश्यक स्रोत मर्ज करें'। कोई पाँसा नहीं। – 2rs2ts

2

एलेक्स, इस प्रयास करें: SVN मर्ज [WorkingFolderPath] 1944 -r: 1943

111

आप TortoiseSVN ग्राहक का उपयोग कर रहे हैं, यह आसानी से via the Show Log dialog किया है।

+5

यह –

+2

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

+14

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

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

यह एकमात्र चीज है जो मेरे लिए काम करती है। –

5

जैसा कि यह कहता है, निम्नलिखित सूखे चलेंगे।

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

सूखी रन अच्छा लगता है, --dry रन के बिना आदेश चला

सत्यापित करें: HEAD वर्तमान संस्करण जा रहा है, पिछला पिछले, फिर अपनी फ़ाइल के लिए पथ, या प्रतिबद्ध मद है संशोधन और पुनः प्रतिबद्धता में परिवर्तन। संस्करण संख्याओं के लिए ब्राउज़ करने के लिए प्रयास करें:

svn log 
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 कर सकता हूं और मैं कोड के साथ समाप्त होता हूं क्योंकि यह फिर से -202 9 5 में था। तब: -

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 

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

+1

एक और बात, जैसा कि पहले से ही कहा गया था, आप जो नहीं कर सकते हैं वह इतिहास से प्रतिबद्धता को हटा देता है, जैसे कि आप सीधे रेफरी हैक करके गिट में कर सकते हैं।आप जो भी कर सकते हैं, अपने स्रोत को बदलने के लिए भंडार का उपयोग करें कि आप इसका इरादा कैसे रखते हैं, और इसे एक बदलाव के रूप में प्रतिबद्ध करें। – sibaz

+0

आगे की जांच करने के बाद मैं देख सकता हूं कि svnadmin का उपयोग करके इतिहास से प्रतिबद्धता को हटाना संभव है लेकिन आपको इसके खिलाफ दृढ़ता से सलाह दी जाती है। Http://stackoverflow.com/questions/5566327/delete-all-traces-of-a-svn-commit देखें – sibaz

1

हालांकि कुछ सुझाव दिए गए सुझाव पहले से ही कुछ लोगों के लिए काम कर सकते हैं, यह मेरे मामले के लिए काम नहीं करता है। विलय करने पर, 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> 

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

25

सबसे पहले, के लिए 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
svn merge -c -M PATH 

यह मेरी जान बचाई।

मुझे एक ही समस्या हो रही थी, पीछे हटने के बाद भी मैं पुराना कोड नहीं देख रहा था। उपर्युक्त आदेश चलाने के बाद मुझे एक साफ़ पुराना संस्करण कोड मिला।

0

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

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

svnrdump आदेश svnadmin डंप के रूप में ही कार्य लेकिन एक दूरस्थ रेपो पर काम करता है।

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

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