किसी फ़ाइल के पिछले SVN संशोधन पर वापस जाने का बेहतर तरीका?


167

मैंने गलती से एक SVN रिपॉजिटरी में बहुत सारी फाइलें कर दीं और कुछ ऐसी चीजें बदल दीं जिनका मुझे कोई मतलब नहीं था। (आहें।) उन्हें उनकी पूर्व स्थिति में वापस लाने के लिए, सबसे अच्छा मैं साथ आ सकता था

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

चीज़! क्या कोई बेहतर तरीका नहीं है? मैं ऐसा कुछ क्यों नहीं लिख सकता:

svn revert -r 854 l3toks.dtx

ठीक है, मैं केवल v1.4.4 का उपयोग कर रहा हूं, लेकिन मैंने 1.5 शाखा के लिए परिवर्तन सूची पर स्किम किया और मैं सीधे इससे संबंधित कुछ भी नहीं देख सका। क्या मैं कुछ भूल गया?


संपादित करें: मुझे लगता है कि मैं पर्याप्त स्पष्ट नहीं था। मुझे नहीं लगता कि मैं विलय करना चाहता हूं, क्योंकि तब मैं उन बदलावों को खो दूंगा जो मैं बनाना चाहता था ! ऐसा कहो fileAऔर fileBदोनों को संशोधित किया गया था लेकिन मैं केवल प्रतिबद्ध करना चाहता था fileA; गलती से टाइपिंग

svn commit -m "small change"

दोनों फ़ाइलों को साझा करता है, और अब मैं वापस रोल करना चाहता हूं fileB। उलटा विलय इस कार्य को आसान नहीं बनाता है (जहां तक ​​मैं बता सकता हूं) ऊपर बताए गए चरणों की तुलना में।


जवाबों:


243
svn merge -r 854:853 l3toks.dtx

या

svn merge -c -854 l3toks.dtx

दोनों आज्ञाएँ बराबर हैं


5
इसके लिए धन्यवाद, बस कुछ बताना चाहता था - कहते हैं, मैं संशोधन I५५ पर हूं svn merge -c -854 my.file, मैं do५४ में संशोधन करने के लिए एक फ़ाइल को वापस करना चाहता हूं। यदि मैं करता हूं , और फिर करता हूं svn diff, तो यह ( ५४ (यानी 85५३) से पहले एक संशोधन दिखाता है। ); केवल जब मैं करता हूं svm merge -c 854 myfile(बिना -), ऐसा लगता है कि मायफाइल को 854 में उलट दिया गया है। फिर से धन्यवाद, चीयर्स!
सादाऊ

11
क्या कोई कारण है कि ऊपर दिए गए पहले विकल्प ने मेरे लिए एक आकर्षण की तरह काम किया जबकि दूसरे ने AT ALL पर काम नहीं किया?
आकाशवाणी

7
हालांकि रिवर्स मर्जिंग के बाद कमिट करना न भूलें। मैं अक्सर भूल जाता हूं :)
विनीत प्रधान

11
इन दो आदेशों के बीच अंतर क्या है, यह न बताने के लिए वास्तव में यह शून्य से 1 होना चाहिए। गरीब जवाब
एंग्री डैन

4
@sprog - अगर कोई अंतर है तो मैं जानना
चाहूंगा

34

"की जाँच करें नाश परिवर्तन " की धारा SVN किताब


5
बाहरी संसाधनों के लिंक को प्रोत्साहित किया जाता है, लेकिन कृपया लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को यह पता चले कि यह क्या है और क्यों है। हमेशा एक महत्वपूर्ण लिंक का सबसे प्रासंगिक हिस्सा उद्धृत करें, यदि लक्ष्य साइट उपलब्ध नहीं है या स्थायी रूप से ऑफ़लाइन है।
user2084795

32

खेद है कि पहले दिए गए उत्तर के पुनर्मूल्यांकन पर कुछ जगह का उपयोग करने के लिए - लेकिन यह एक ऐसी चीज है जिससे मैं हमेशा परेशान रहता हूं।

मान लीजिए कि मैंने स्थानीय फ़ाइलों को नवीनतम संशोधन में अपडेट किया है, जो 854 है। फिर, मैं एक पुराना संशोधन प्राप्त करना चाहता हूं - कुछ संशोधन से पहले फ़ाइल का संस्करण, संशोधन 851 कहते हैं।

कॉपी काम करेगी:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. हालाँकि, मुझे रेपो URL के लिए परेशान नहीं किया जा सकता है :)

अद्यतन प्रतीत होता है काम हो सकता है:

svn up -r 851 ./l3toks.dtx

... हालाँकि, यह स्थानीय कॉपी को "नए सिरे से चेक आउट" के रूप में या "ऑनलाइन संशोधन के समान" के रूप में चिह्नित करता है (यानी कछुए / खरगोश खरगोश में आपको एक हरे रंग की ओके चेकमार्क मिलता है) - जिसका अर्थ है कि आप ऐसा नहीं कर सकते svn ci -m "rolled back to r 851": बस इसलिए कि स्थानीय subversionनिष्पादन योग्य कोई भी स्थानीय परिवर्तन नहीं देखेगा, और ऑनलाइन रिपॉजिटरी में कुछ भी अपलोड करने के लिए परेशान नहीं होगा।

और, जैसा कि पहले ही उत्तर दिया गया है, रिवर्स मर्ज काम करता है - लेकिन इस मामले में, किसी को शॉर्टकट सिंटैक्स पर भरोसा नहीं करना चाहिए; लेकिन विशेष रूप से राज्य:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

मुझे स्वीकार करना चाहिए - मैं कभी भी वाक्य को " r852 के माध्यम से r852 को फाइल में उलट-पलट कर " समझने के लिए नहीं कहूंगा " बस आपकी फाइल का r851 मिला है, और जो कुछ भी आपके पास पहले था स्थानीय रूप से अधिलेखित है - और यह नवीनतम ऑनलाइन संशोधन के रूप में अलग-अलग चिह्नित है।" आप इसे नए 'रोलबैक' संशोधन के रूप में ऑनलाइन वापस देख सकते हैं , लेकिन मुझे लगता है (और आशा :)) कि यह क्या है :)

इसके बाद, svn diffयदि हम स्थानीय रूप से सही संशोधन प्राप्त कर लेते हैं, तो एक त्वरित बदलाव के लिए उपयोग कर सकते हैं ; और भी, फ़ाइल को Tortoise / RabbitVCS (जो नवीनतम प्रतिबद्ध संस्करण से अलग है) में लाल विस्मयादिबोधक चिह्न के साथ चिह्नित किया जाएगा, और इसलिए svn ci -m "rolled back to r 851"इस समय चल सकता है।

यह भी ध्यान दें कि यदि आप, आखिरकार, रिवर्स मर्जिंग के बाद अपना दिमाग बदलते हैं ( यानी आप वैसे भी नवीनतम, HEAD संशोधन पर काम करना चाहते हैं, तो यहां 854 - आपके द्वारा स्थानीय रूप से 851 पर वापस आने के बाद, लेकिन अभी तक रोलबैक नहीं किया है ), आपको उपयोग नहीं करना चाहिए svn up, क्योंकि यह केवल यह कहेगा कि यह पहले से ही " संशोधन 854 पर " है; इसके बजाय svn revert --recursive .या इसी तरह का उपयोग करें ...

चीयर्स!

रेफरी: कैसे तोड़फोड़ का उपयोग करके परिवर्तन वापस करें - जैकब राइट - फ्लेक्स, एआईआर, पीएचपी, आदि।

संपादित करें: ... और जाहिर है, बिल्कुल वैसा ही प्रभाव svn merge -r HEAD:851 l3toks.dtx, जैसा हासिल किया जा सकता है:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

2
आपको हमेशा से ही svn निर्यात पसंद करना चाहिए, क्योंकि यह वही करता है जो आप चाहते हैं - एक निश्चित संशोधन में एक फ़ाइल की जांच करें, जबकि रिवर्स मर्जिंग भी निर्दिष्ट संस्करण के साथ आपके स्थानीय परिवर्तनों का प्रयास और विलय करेगी, यह एक जटिल और पागल ऑपरेशन है, जो है यदि आप नहीं देखते हैं, तो त्रुटियों की संभावना है!
फाल्को

1
मुझे रिवर्स मर्जिंग की समस्या थी। यह जानने के बजाय कि मैंने निर्यात की कोशिश क्यों की, और इसने पूरी तरह से काम किया। मैं अत्यधिक निर्यात का उपयोग करने की सलाह दूंगा। आप --forceनिर्देशिकाओं को अधिलेखित करने के लिए उपयोग कर सकते हैं । बस याद रखें कि यह किसी भी परिवर्तन को अधिलेखित कर देगा।
निक

वास्तव में क्या हो रहा है, इसके बारे में बहुत अच्छी व्याख्या! मैं अक्सर AnkhSVN और TortoiseSVN का उपयोग करता हूं, और मैं कहीं भी उपयोग करने के लिए नहीं देखता हूं - क्या svn exportमुझे कुछ याद आ रहा है या क्या यह सिर्फ इन GUI में लागू नहीं है?
कॉनरैड

@Conrad, आप AnkhSVN में "Export ..." पर क्लिक करके और अपने रिपॉजिटरी संदर्भ (राइट-क्लिक) मेनू से TortoiseSVN में "Export" पर क्लिक करें
nitinr708

10

मुझे हाल ही में एक पुराने बिल्ड को डीबग करने के लिए एक विशेष संशोधन पर वापस लौटना पड़ा और इसने जादू की तरह काम किया:

svn up -r 3340 (or what ever your desired revision number)

मुझे "tc" विकल्प का उपयोग करके सभी संघर्षों को हल करना था क्योंकि मुझे स्थानीय परिवर्तनों की परवाह नहीं थी (सब कुछ जो मैंने ध्यान में रखते हुए पहले ध्यान दिया था)

हेड रिविजन में वापस आना भी सरल था:

svn up

5

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


4

रिवर्स मर्ज वही है जो आप चाहते हैं (देखें लुपायड का जवाब)। पूरी निर्देशिका के बजाय गलत तरीके से शुरू की गई फ़ाइल में मर्ज लागू करें।


4

यदि आप केवल अंतिम चेकइन को पूर्ववत करना चाहते हैं, तो आप निम्नलिखित का उपयोग कर सकते हैं

svn merge -r head:prev l3toks.dtx

इस तरह, आपको वर्तमान और पिछले संस्करण संख्या के लिए शिकार नहीं करना है।


4

svn मर्ज संशोधन को मर्ज करेगा, उन्हें वापस नहीं करेगा। यानी यदि आपके HEAD संस्करण में कुछ अतिरिक्त है तो पिछले संशोधन के साथ विलय कर दें, फिर परिवर्तन जारी रहेगा।

मैं svn बिल्ली का उपयोग करता हूं फिर इसे फ़ाइल में रीडायरेक्ट करता हूं:

svn cat -r 851 l3toks.dtx > l3toks.dtx

फिर आपके पास उस फ़ाइल में 851 सामग्री है और इसे वापस चेक कर सकते हैं।


3

यदि आप एसवीएन प्लगइन के साथ ग्रहण आईडीई का उपयोग करते हैं, तो आप निम्नानुसार कर सकते हैं:

  1. उन फ़ाइलों पर राइट-क्लिक करें, जिन्हें आप वापस करना चाहते हैं (या वे जिस फ़ोल्डर में निहित थे, यदि आपने उन्हें गलती से हटा दिया है और आप उसे वापस जोड़ना चाहते हैं)
  2. " टीम> स्विच चुनें " चुनें
  3. "संशोधन" रेडियन बटन चुनें, और उस संशोधन संख्या को दर्ज करें जिसे आप वापस करना चाहते हैं। ओके पर क्लिक करें
  4. सिंक्रनाइज़ किए जा रहे परिप्रेक्ष्य में जाएँ
  5. उन सभी फ़ाइलों का चयन करें जिन्हें आप वापस करना चाहते हैं
  6. चयन पर राइट-क्लिक करें और " ओवरराइड और कमिट करें ... "

यह उन फाइलों को वापस कर देगा जो आप चाहते हैं। बस ध्यान रखें कि एसवीएन परिवर्तनों को एक नई प्रतिबद्धता के रूप में देखेगा। यही है, परिवर्तन को एक नया संशोधन नंबर मिलता है, और पुराने संशोधन और नए के बीच कोई लिंक नहीं होता है। आपको उन टिप्पणियों में निर्दिष्ट करना चाहिए जो आप उन फ़ाइलों को एक विशिष्ट संशोधन में दे रहे हैं।

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