كيف يمكنني العودة إلى إصدار أقدم من التعليمات البرمجية الخاصة بنا في Subversion؟

StackOverflow https://stackoverflow.com/questions/814433

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أعمل في مشروع مع صديق وأريد العودة إلى الإصدار الأقدم من الكود الخاص بنا وتعيينه ليكون الإصدار الحالي.كيف فعلتها؟

أنا أستخدم "anksvn" على vs08.

لدي الإصدار الذي أريده على جهاز الكمبيوتر الخاص بي، لكن الالتزام يفشل؛الرسالة التي أحصل عليها هي "الالتزام فشل ، ملف أو دليل قديم."

لدي أيضًا عميل التخريب على جهاز الكمبيوتر الخاص بي.

هل كانت مفيدة؟

المحلول

وفي الأساس تحتاج إلى "دمج الوراء" - تطبيق فرق بين النسخة الحالية والسابقة <م> إلى الإصدار الحالي (حتى ينتهي بك الأمر مع نسخة عمل تبحث مثل النسخة القديمة) ومن ثم ارتكاب مرة أخرى. هكذا على سبيل المثال للانتقال من مراجعة 150 (الحالي) إلى مراجعة 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

وكتاب التخريب الأحمر لديه <لأ href = "http://svnbook.red-bean.com/en/1.8/svn.branchmerge.basicmerging.html#svn.branchmerge.basicmerging.undo" يختلط = "noreferrer "> قسم جيدة حول هذا .

نصائح أخرى

يمكنك فقط إجراء تغييرات جديدة على رأس من تاريخ التخريب.

السبب وراء عدم قدرتك على فعل أي شيء مباشرة باستخدام النسخة الجيدة الموجودة على جهاز الكمبيوتر الخاص بك، هو أنها .svn تعرف المجلدات أنه رمز من الماضي، لذا يتطلب التحديث قبل أي التزام.

ابحث عن رقم المراجعة الجيد وقم بالرجوع إليه

  1. ابحث عن رقم المراجعة للنسخة القديمة التي تريدها.احصل على مراجعتك الحالية مع:

    svn info --show-item revision
    # or
    svn log
    

    او استعمل:

    svn update -r <earlier_revision_number>
    

    للتحقق من الإصدارات القديمة المختلفة لمشروعك، حتى تجد رقم المراجعة الصحيح.

  2. قم بتدوين رقم المراجعة الجيد (على افتراض 123 للأمثلة أدناه).

  3. التحديث إلى أحدث مراجعة:

    svn update
    
  4. التراجع عن كافة التغييرات بين المراجعة التي تريدها والإصدار الأحدث:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (نفس إجابة جون سكيت أعلاه.)

إذا لم تتمكن من العثور على رقم المراجعة

إذا لم تتمكن من العثور على النسخة القديمة، وتريد فقط تثبيت الملفات الموجودة حاليًا على جهاز الكمبيوتر الخاص بك:

  1. قم بعمل نسخة من نسختك الجيدة (ولكن بدون أي نسخة .svn المجلدات):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. تأكد الآن أن لديك الإصدار الأحدث:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. انسخ نسختك الجيدة أعلى نسخة العمل.

    سيقوم هذا الأمر بنسخ وحذف أي ملفات من شجرة العمل غير موجودة في نسختك الجيدة، ولكنه لن يؤثر على الملفات الموجودة .svn المجلدات.

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    إذا لم يكن لديك rsync، يمكنك استخدامه cp -a ولكنك ستحتاج أيضًا إلى حذف أي ملفات غير مرغوب فيها يدويًا.

  4. يجب أن تكون قادرًا على الالتزام بما لديك الآن.

    cd project
    svn commit "Reverted to good copy"
    

ومجرد استخدام هذا الخط

<اقتباس فقرة>   

وتحديث إس -r yourOldRevesion

ويمكنك معرفة النسخة الحالية باستخدام:

<اقتباس فقرة>   

وإس المعلومات

الطريقة القياسية لاستخدام الدمج للتراجع عن تسجيل الوصول بالكامل تعمل بشكل رائع، إذا كان هذا هو ما تريد القيام به.ومع ذلك، في بعض الأحيان، كل ما تريد فعله هو إرجاع ملف واحد.لا توجد طريقة مشروعة للقيام بذلك، ولكن هناك اختراق:

  1. ابحث عن الإصدار الذي تريده باستخدام سجل svn.
  2. استخدم الأمر الفرعي للتصدير الخاص بـ svn:

    تصدير svn http://url-to-your-file@123 /tmp/اسم الملف

(حيث 123 هو رقم المراجعة لإصدار جيد من الملف.) ثم قم بنقل هذا الملف الفردي أو نسخه للكتابة فوق الملف القديم.تحقق من الملف المعدل وقد انتهيت.

أكثر قليلا من المدرسة القديمة

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

ثم المعتاد

svn diff
svn commit

وأعتقد أن هذا هو الأكثر ملاءمة:

هل دمج الوراء، على سبيل المثال، إذا كان رمز ملتزمة يحتوي على المراجعة من القس 5612-5616، مجرد دمج إلى الوراء. وهو يعمل في نهايتي.

وعلى سبيل المثال:

svn merge -r 5616:5612 https://<your_svn_repository>/

وسيكون تحتوي على رمز اندمجت العودة إلى المراجعة السابق، ثم هل يمكن ارتكابها.

وهذا ما فعلته وعملت بالنسبة لي.

أريد التراجع عن التغييرات في عمليات الالتزام المتعددة التي قمت بها في أوقات معينة وأريد الانتقال إلى نقطة الالتزام السابقة.

  1. انتقل إلى الفريق -> إظهار السجل.
  2. انقر بزر الماوس الأيمن على نطاق المراجعات أو نطاقها الذي تريد تجاهله.
  3. حدد خيار "التراجع عن التغييرات".

سيؤدي هذا إلى تشغيل دمج عكسي، والتراجع عن التغييرات في نسخة العمل الخاصة بك.

فقط قم بمراجعة الكود والالتزام.

وانقر بزر الماوس الأيمن على أعلى التسلسل الهرمي تريد أن تعود >> Revert أو Revert to Revision

وانقر بالزر الأيمن للمشروع> استبدال ب> مراجعة أو URL> حدد تنقيح محددة تريد العودة.

والآن ارتكاب رمز إصدار التحديث المحلي إلى مستودع. هذا وسوف تعود القاعدة رمز إلى تنقيح محددة.

معظم الإجابات السابقة كانت تستخدم الدمج العكسي، وعادةً ما تكون هذه هي الإجابة الصحيحة.ومع ذلك، هناك موقف واحد (الذي حدث لي للتو) حيث لم يكن الأمر كذلك.

لقد قمت بطريق الخطأ بتغيير ملف به نهايات أسطر Unix إلى نهايات أسطر DOS عند إجراء تغيير بسيط، وقمت بتنفيذ ذلك.يمكن التراجع عن ذلك بسهولة، إما عن طريق تغيير نهايات الأسطر والالتزام بها مرة أخرى، أو عن طريق الدمج العكسي، ولكن له تأثير في جعل svn blame أدرج تعديلي كمصدر لكل سطر من الملف.(ومن المثير للاهتمام أن TortoiseSVN على نظام التشغيل Windows لا يتأثر بهذا؛سطر الأوامر فقط svn blame.)

إذا كنت ترغب في الحفاظ على التاريخ كما ذكرت svn blame, ، أعتقد أنك بحاجة إلى القيام بما يلي:

  • احذف الملف والتزم.
  • في المستودع، انسخ النسخة الجيدة السابقة من الملف إلى الرأس والتزم بها.
  • قم باستعادة أي تعديلات تريد الاحتفاظ بها.

يعد الحذف مخيفًا بعض الشيء، لكن تذكر أن الملف محفوظ دائمًا في المستودع، لذا فإن استعادته ليست مشكلة كبيرة.وإليك بعض التعليمات البرمجية لتوضيح الخطوات.افترض أن xxx هو رقم المراجعة لآخر نسخة جيدة.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

لاحظ أنه بالنسبة للنسخة الموجودة في المستودع، يجب أن تكون الوجهة دليلاً، وليس اسم ملف.

ومزامنة للنسخة قديمة وارتكابها. هذا ينبغي أن تفعل خدعة.

هنا أيضا تفسيرا للتغيرات التراجع.

إجابة جون سكيت هي الحل باختصار إلى حد كبير، ولكن إذا كنت مثلي، فقد تحتاج إلى تفسير.يسمي دليل التخريب هذا بـ

الكرز اختيار دمج

من صفحات الرجل.

  1. يُسمى هذا النموذج بدمج "اختيار الكرز":يشير "-r n: m" إلى الفرق في تاريخ فرع المصدر بين المراجعات N و M.

    يمكن استخدام "النطاق العكسي" للتراجع عن التغييرات.على سبيل المثال ، عندما تشير المصدر والهدف إلى نفس الفرع ، يمكن "التراجع" مراجعة ملتزمة مسبقًا.في النطاق العكسي, ، n أكبر من m في '-r n: m' ، أو يتم استخدام خيار '-c' مع رقم سالب:"-C -M" يعادل "-r m: '.تُعرف تغيير التغييرات مثل هذا أيضًا باسم "الاندماج العكسي".


  • إذا كان المصدر ملفًا ، فسيتم تطبيق الاختلافات على هذا الملف (مفيد للتغييرات السابقة لاستخلاص العكس).خلاف ذلك ، إذا كان المصدر هو دليل ، فإن الهدف الافتراضي إلى ".".

    في الاستخدام العادي ، يجب أن تكون نسخة العمل محدثة ، في مراجعة واحدة ، مع عدم وجود تعديلات محلية وعدم وجود لقطات فرعية.

مثال:

svn merge -r 2983:289 path/to/file

سيؤدي هذا إلى استبدال النسخة المحلية [2983] (والتي، وفقًا للاقتباس أعلاه، يجب أن تكون متزامنة مع الخادم - مسؤوليتك) بالمراجعة 289 من الخادم.يحدث التغيير محليًا، مما يعني أنه إذا كان لديك عملية دفع نظيفة، فيمكن فحص التغييرات قبل الالتزام بها.

وهناك الكثير من الإجابات خطيرة على هذه الصفحة. لاحظ أنه منذ SVN النسخة 1.6، والقيام تحديثا -r يمكن أن يسبب الصراعات الشجرة التي صعدت بسرعة إلى يحتمل فقدان البيانات كابوس kafkeresque أين أنت غوغلينغ للحصول على معلومات حول النزاعات شجرة.

والطريقة الصحيحة للعودة إلى الإصدار هو:

svn merge -r HEAD:12345 .

وأين 12345 هو رقم الإصدار. لا ننسى نقطة.

لقد نجح ما يلي بالنسبة لي.

لقد أجريت الكثير من التغييرات المحلية وأحتاج إلى تجاهل تلك الموجودة في النسخة المحلية والخروج من آخر إصدار ثابت في SVN.

  1. التحقق من حالة كافة الملفات، بما في ذلك الملفات التي تم تجاهلها.

  2. Grep جميع الأسطر للحصول على الملفات المضافة والمتجاهلة حديثًا.

  3. استبدل تلك بـ //.

  4. و rm -rf جميع الخطوط.

    SVN الحالة-لا ignore | grep '^[؟ i]' | sed "s/^[؟ i] //" | Xargs -i {} rm -rf "{}"

scroll top