سؤال

أنا أستخدم CVS2SVN لتحويل مستودعي. لقد فعلت ذلك بالنجاح في مستودع واحد، والآن مشكلتي الجديدة هي مستودع ثان.

في تحويلي الجديد، أريد تحويل الرأس فقط فرع واحد. تتمتع CVS2SVN فقط بوظيفة "استبعاد" للفروع، ولكن لا "تشمل". لدي العديد من الفروع واستثناء كل واحد منهم سوف يستغرق الكثير من العمل ....

هل هناك أي طريقة لتحويل الجذع فقط (الرأس) وفرع واحد فقط؟

شكرا، أود

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

المحلول

إذا كنت ترغب فقط في الاحتفاظ بفرع واحد ولا علامات, ، ثم هذا سهل. يتم استخدام القاعدة الأولى التي تطابق رمز، لذلك حدد الفرع الذي تريد إدراجه ثم استبعاد كل شيء آخر:

cvs2svn --force-branch=mybranch --exclude='.*' ...

إذا كنت ترغب في تضمين ليس فقط الفرع ولكن أيضا أكبر عدد ممكن من العلامات، فمن الصعب قليلا. لا تعرف فقط أسماء جميع العلامات بالضرورة بالضرورة، لكنك لا تستطيع أيضا تضمين علامات تعتمد على الفروع المستبعدة. في هذه الحالة، من الأسهل العمل مع خيارات -WORITE-INFO-INFO-INFO-HINTS - تلميحات -

cvs2svn --write-symbol-info=symbol-info.out --passes=1:3 ...

سيؤدي ذلك إلى إنشاء ملف يسمى "Symbol-info.out" يحتوي على معلومات حول جميع رموز CVS. في المحرر الخاص بك، افتح هذا الملف، ابحث عن جميع الأسطر التي تتوافق مع الفروع التي تريد استبعادها، وتغيير العمود الثالث من تلك الأسطر إلى كلمة "استبعاد". تأكد من أن العمود الثالث من سطر الفرع الذي تريد تضمينه يحتوي على كلمة "فرع" وعمودها الرابع هو المسار الذي تريد أن ينتهي به الأمر.

الآن تشغيل CVS2SVN مرة أخرى، بدءا من تمرير 3، واستخدام ملف معلومات الرمز المحرر كملف تلميحات رمز:

cvs2svn --symbol-hints=symbol-info.out --passes=3 ...

سوف تحصل على الكثير من الأخطاء مثل:

ERROR: ExcludedSymbol('FOO_BRANCH') cannot be excluded because the following symbols depend on it:
    BAR_TAG
    BAZ_TAG

الآن العودة إلى المحرر وتغيير العلامات المدرجة (BAR_TAG و BAZ_TAG في المثال) المراد استبعادها أيضا، ثم حاول تشغيل Pass3 مرة أخرى. قد يحتاج هذا الإجراء إلى تكرار عدة مرات، لكن لا ينبغي أن يكون مرهقا لأن Pass3 يعمل بسرعة كبيرة.

عندما تكون قد حصلت على Pass3 لإكمالها دون أخطاء، قم بتشغيل بقية التحويل:

cvs2svn --symbol-hints=symbol-info.out --passes=4: ...

نصائح أخرى

مشكلة واحدة هي أن CVS2SVN لا يحتاج فقط إلى تحديد ما إذا كنت تريد تضمين فرع أم لا، ولكن (في وقت واحد) ما إذا كان الرمز هو فرع أو علامة في المقام الأول. لذلك إذا كنت ترغب في تضمين فرع واحد، وكذلك بعض العلامات، فمن الصعب أكثر من مجرد قول "تشمل فقط هذا الفرع" - القيام بذلك ستقتل جميع العلامات.

Iow، CVS2SVN لا يدعم ذلك حقا. يمكنك العمل حولها عن طريق تحرير شفرة المصدر الخاصة بها. في cvs2svn_lib.symbol_strategy.branchifcommits، قم بتغيير الحالة حيث ترجع الفرع (الرمز) إلى

   if symbol.name == 'my_branch':
       return Branch(symbol)
   else:
       return ExcludedSymbol(symbol)

IIUC، يجب أن تستخدم BrustrifeCommits بشكل افتراضي.

شخصيا، أود استخدام استراتيجية مختلفة:

 1. convert the repository once, with all branches.
 2. do a "svn ls" on branches, and redirect that into a file.
 3. edit the file to construct an exclude regex out of it, of the form `b1|b2|...|bn`

لن أتصل به الكثير من العمل ...

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