كيفية تحديث فرع الميزة بشكل صحيح من الجذع؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

يقول كتاب SVN:

...Another way of thinking about this pattern is that your weekly sync of trunk to branch is analogous to running svn update in a working copy, while the final merge step is analogous to running svn commit from a working copy

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

  1. من SVN v1.5، يتم الدمج مراجعة تلو الأخرى.سيؤدي اختيار المناطق المراد دمجها بشكل متقن إلى قيامنا بحل تعارضات فرع الجذع مرتين (واحدة عند دمج مراجعات الجذع في FB، ومرة ​​أخرى عند الدمج مرة أخرى).
  2. حجم المستودع:قد تكون تغييرات قناة الاتصال مهمة بالنسبة لقاعدة تعليمات برمجية كبيرة، وقد يكون نسخ ملفات الاختلافات (على عكس نسخة SVN) من قناة قناة في مكان آخر بمثابة عبء كبير.

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

كيف تتعامل مع هذا الموقف؟

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

المحلول 2

بعد البحث:

بعد العديد من جلسات العصف الذهني في Visionmap، ومناقشات F2F بما في ذلك Artyom، وفتح حافظة كتب SVN، وما إلى ذلك - يبدو أن هذا غير ممكن.فرع الميزة لا يشبه نسخة العمل تمامًا.طريقة العمل الوحيدة لتحديثه هي إعادة إنشاء فرع جديد، كما هو موضح أعلاه.

نصائح أخرى

من SVN v1.5، يتم الدمج مراجعة تلو الأخرى.إن اختيار المناطق المراد دمجها بشكل متقن من شأنه أن يجعلنا نحل صراعات الجذع والفروع مرتين (واحدة عند دمج مراجعات الجذع في الفيسبوك، ومرة ​​أخرى عند الدمج مرة أخرى)

إذن أنت تفعل شيئًا خاطئًا!

دعنا نرى:

trunk    fb
 ---------\
 r1-10    |
 r11-20   |
 r20-30   |

بشكل عام ، إذا كنت تريد إجراء تغييرات في 11-20 ، فإن أفضل الممارسات هي دمج 1-20 إلى FB والحصول على كل شيء هناك.

ثم عند الانتهاء من الفيس بوك، قم بدمج 20-30 ثم ينسخ الفيسبوك إلى الجذع (لا يوجد دمج!).

إذا قررت دمج R11: 20 ، حسنًا ، في النهاية ، فستحتاج إلى دمج R1: 10 و R20: 30 ثم ينسخ الفيس بوك إلى الجذع.

لا توجد طريقة لدمج التغييرات مرتين!

أفترض أنك ربما تفعل ما يلي:

copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG

لا يمكنك القيام بذلك لأنك ستقوم بدمج 11:20 مرتين.يجب عليك دائمًا دمج الكود في اتجاه واحد فقط.

طريقة صحيحة:

copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk

يحرر

إذن الخطوات الصحيحة هي:

  1. إنشاء فرع ميزة (FB) من الجذع (نسخ الجذع إلى فرع الميزة باستخدام نسخة svn)

    FB_0=trunk_0
    
  2. العمل على الفيسبوك.

    FB_1=FB_0 + change_a
    
  3. دمج كافة التغييرات القادمة من الجذع إلى FB.

    trunk_1=trunk_0 + tr_change_a;
    FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
    
  4. العمل على الفيسبوك

    FB_3 = FB_2 + change_b
    
  5. دمج جميع القادمة التغييرات غير المدمجة من الجذع إلى FB.

    trunk_2=trunk_1 + tr_change_n;
    FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    
  6. في هذه المرحلة لدينا فرع الميزة الذي يتكون من الجميع ميزات جديدة والجميع التغييرات في الجذع.لذلك نقوم فقط بنسخ الفرق بين فرعين.

    trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    

    الآن تم حذف FB لأن صندوق الأمتعة يحتوي على جميع التغييرات التي نحتاجها.

    يتم تنفيذ الخطوة الأخيرة عن طريق:

    svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev .
    svn ci
    

    أو في اللغة العادية تأخذ فرقًا بين الجذع والفرع ووضعها على جذع مما يجعلها مكافئة.

تم وصف هذا النمط في http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature

الآن إذا لم ينجح هذا بالنسبة لك، فأنا لا أفهم السؤال.

تحرير 2: لsvn-1.5

عند العمل مع svn-1.5، يمكنك الدمج بشكل أسهل بكثير:

عندما تعمل على فرع الميزات، ما عليك سوى دمج التغييرات من وقت لآخر:

$ svn merge /path/to/trunk
Solve conflicts
$ svn ci

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

$ svn merge --reintegrate /path/to/fb
$ svn ci

في الأخير، يجب ألا يكون هناك أي صراعات إذا كنت تعمل كما هو موضح.

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

مع هذا الدمج المستمر نتجنب الكثير من الصراعات.

بلدي 2 سنتا.

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

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

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

أعتقد أنني يجب أن أتحمل الهراوات من أجل @Artyom هنا.وأعتقد أيضا أنه إذا كان عليك ذلك

حل الصراعات الجذع فرع مرتين

هناك شئ غير صحيح.وأعتقد أن حجة/حل @Artyoms قوي جدًا.

أعتقد أن أحد الأشياء البسيطة التي كان من الممكن أن يكتبها @Artyom بشكل أوضح هو أنه في النهاية "تنسخ" fb ل trunk أنت لا تستخدم svn copy لكن svn merge (أو svn merge --reintegrate).قد يكون هذا هو السبب وراء عدم العثور على نمط "نسخ الدمج" فيه أنماط المتفرعة المشتركة.

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

وهنا ما أسمع:

بدلاً من ذلك ، نفعل ما نسميه "إعادة الفرع".في هذه الحالة ، عندما تكون هناك حاجة إلى جزء كبير من تغييرات الجذع ، يتم فتح فرع ميزة جديد من الجذع الحالي ، ...

الآن لديك فرع جديد (دعنا نسميه b2) يعادل الجذع، أليس كذلك؟و أين هل هناك حاجة إلى "جزء كبير من تغييرات الجذع"؟أفترض في الفيسبوك؟

... والاندماج دائمًا ما يكون لأسفل (فروع الميزات -> trunk -> فروع مستقرة).

ولكن بما أنك أنشأت للتو b2 من صندوق السيارة، فلا يوجد شيء يمكن دمجه في صندوق السيارة، أليس كذلك؟وأنت لا تقوم بدمج التغييرات من b2 إلى fb أيضًا (لأن هذا سيكون هو نفسه دمج الجذع مع fb...).إذًا كيف يمكن لـ "أجزاء كبيرة من التغييرات" أن تدخل إلى فيسبوك؟وبمجرد وصولهم إلى هناك، لماذا تريد دمجهم مرة أخرى في صندوق السيارة (نظرًا لأن هذا هو المكان الذي أتوا منه في المقام الأول)؟

في الواقع الروابط التالية القسم المسمى "تتبع عمليات الدمج يدويًا" و/أو القسم المسمى "دمج فرع كامل إلى آخر" المنصوص عليها في وثائق SVN 1.4 (أعلم أنك لا تستخدم SVN 1.4 ولكني أعتقد أنه ينطبق على أي حال) ضمن أنماط المتفرعة المشتركة قد يساعد في توضيح بعض الأمور.هذه الروابط "مفقودة" في وثائق الإصدار 1.5 (ربما بسبب الإصدار الجديد --reintegrate الخيار في merge).

يبدو أنك تقوم بدمج نفس التغييرات مرتين وأعتقد حقًا أنه لا ينبغي عليك (تحتاج) إلى القيام بذلك.

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