سؤال

أرغب في تحويل مشروع CVS إلى Subversion باستخدام cvs2svn.له جذع رئيسي (HEAD)، مع عدة فروع تطوير مؤقتة تم إنشاؤها من الجذع.

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

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

بمعنى آخر، بعد التحويل، سيكون هناك عدد من الاختلافات بين الجذع وأي فرع معين.في المرة القادمة التي أقوم فيها بالدمج من الجذع إلى الفرع، لا أريد أن أرى تلك الاختلافات كتغييرات تحتاج إلى الدمج.ولكن عندما أندمج من الفرع إلى الجذع، أفعل ذلك.هل هذا ممكن؟

تحديث:لقد قبلت اقتراح mhagger وأخبرت SVN أن الفروع قد تم دمج جميع التغييرات بالفعل من صندوق السيارة:

svn co [branch URL] .
svn merge --record-only [trunk URL]
svn commit -m ''

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

ولكن لا يزال لدي مشكلة مع --reintegrate يدمج، من الفرع إلى الجذع.وينتهي الأمر بإظهار الكثير من الملفات المستبدلة "R"، مما يعني أن الجذع يحتوي على ملف X، والفرع لديه ملف X، لكنهما لا يعتبران نفس الملف.وهذا يجعل عملية الدمج فوضوية نوعًا ما، على الرغم من أنها تبدو وكأنها تنتهي بالنتائج الصحيحة.

أعتقد أن هذا يحدث بسبب التسلسل التالي للأحداث:

  • تم إنشاء الفرع (في CVS)
  • تمت إضافة ملف X إلى صندوق السيارة (في CVS)
  • تم دمج X في الفرع (أيضًا في CVS)
  • تم تحويل المشروع إلى التخريب
  • لم يكن Subversion يعلم أنه تم نسخ الفرع/X من صندوق الأمتعة/X.لذلك يعتقد أنه بديل.

يبدو تاريخ SVN كما يلي:

r100: create branch (copied from trunk)
r200: add trunk/X
r300: add branch/X (because of a CVS merge, but it's not a SVN copy)

لذلك ، هل هناك طريقة لي أن أقول التخريب لتجاهل أجداد الملفات عند القيام بدمج -الاندماج؟أو طريقة أفضل لتحويل هذه الملفات؟

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

المحلول 2

حسنًا، أعتقد أن لدي حلاً بديلاً لمشكلة --reintegrate أعلاه، في حال كان أي شخص مهتمًا.

وفق هذا المستند, ، إذا قمت بدمج أحدث إصدار من الجذع في الفرع، فإن إجراء --reintegrate هو في الأساس نفس القيام بذلك على الجذع:

svn merge [trunk URL] [branch URL]

لكن بناء الجملة هذا يسمح بـ --ignore-ancestry، وهو ما لا يسمح به --reintegrate.لذلك أستطيع أن أفعل:

svn merge --ignore-ancestry [trunk URL] [branch URL]

وهذا يظهر لي نفس النتائج مثل --reintegrate، بدون جميع الملفات المستبدلة "R".يبدو أن الاختلاف الوحيد الآخر هو خصائص معلومات الدمج.لست متأكدًا مما إذا كان هذا صحيحًا أم لا، لذلك ربما يكون من الأفضل حذف الفرع بعد ذلك، تمامًا كما تفعل بعد --reintegrate.

نصائح أخرى

كما تعلم على الأرجح، لا يُنشئ ملف cvs2svn أي بيانات تعريف مدمجة، باستثناء المعلومات الضمنية حول مصدر ظهور الفروع.(لا يمكن ذلك، لأن CVS لا يسجل مثل هذه المعلومات.) لذلك، بعد التحويل، سيتعين عليك إخبار Subversion صراحةً عن عمليات الدمج التي تم إجراؤها ضمن CVS.

أسهل طريقة للقيام بذلك هي باستخدام "svn merge --record-only ..."، كما هو موضح في كتاب التخريب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top