باستخدام دمج الشجرة الفرعية GIT ، مع الاندماج أيضًا في جميع فروع جميع الأشكال الفرعية المدمجة

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

  •  22-09-2019
  •  | 
  •  

سؤال

أرغب في استخدام تعقب المشكلات الشهير مفتوح المصدر (Redmine) يوفر تكامل GIT. لسوء الحظ ، لا يمكن أن يرتبط كل مشروع في المتتبع إلا بإعادة ريبو بوابة واحدة. إن إنشاء مشاريع متعددة في Tracker ليس الإعداد المثالي.

مع وضع ذلك في الاعتبار ، حاولت استخدام دمج الشجرة الفرعية GIT (أوضح هنا, ، و هنا). لقد قمت بإنشاء ريبو "مظلة" تم دمجه في كل من عمليات إعادة الشراء الأخرى التي أعمل معها.

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

هل هذا ممكن؟

ائتمان إضافي: ماذا لو كان لكل من كل من كل فرع فرع له نفس الاسم؟

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

المحلول

لأولئك منا غير على دراية بـ Redmine ، يرجى تمديد الوصف الخاص بك لتضمين إجابات على الأسئلة التالية: ما نوع الوصول إلى المستودع الذي يحتاجه المتتبع؟ هل ستحتاج إلى جعل الاهتمامات الخاصة بها؟ أم أنها تحتاج فقط إلى أنواع معينة من الوصول إلى القراءة (ربما للتحقق من صحة تجزئة الالتزام ومسح سجلات الالتزام للكلمات الرئيسية)؟

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

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

لكن السؤال المثير للاهتمام ليس "ماذا لو كان لدى مستكدين لهما فروع تحمل نفس الاسم؟" ، ولكن "كيف تتعامل مع الحالة التي يفقد فيها المستودع فرعًا من المجموعة العالمية؟".

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

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

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


جمع الفروع ، دون دمج

إذا كان Redmine يحدد --mirror استنساخ ، والضغط هو أنه يتوقع الفروع المحلية وقد لا تكون قادرة على قراءة مباشرة "Braches Tracking Raches" ، لذلك ربما ستحتاج إلى إنشاء وتحديث بعض الفروع المحلية.

الفروع المحلية تم تحديثها من "فروع التتبع عن بُعد"
  • الإعداد الأولي

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.;s.remotes.tags/all.')"
        git config remote.$r.tagopt --no-tags
    done
    
  • تحديث دوري

    git remote update
    git for-each-ref --shell --format \
      'git branch --force --track -l all/%(refname:short) %(refname:short)' refs/remotes \
      | sh
    
الفروع المحلية التي تتلقى مباشرة نصائح فرع جلب
  • الإعداد الأولي

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')"
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')"
        git config remote.$r.tagopt --no-tags
    done
    
  • تحديث دوري

    git remote update
    

كلتا الطريقتين تنتهي بجمع الفروع تحت refs/heads/all/<remote-name>/<branch-name-on-remote>, ، ولكن الأول يحتوي أيضًا على مجموعة مكررة من الحكام تحت refs/remotes/<remote-name>/<branch-name-on-remote>. الأول يستخدم مرجع الجلب العادي ويستخدم git branch لتكرار "فروع التتبع عن بُعد" (refs/remotes/…) في الفروع العادية والمحلية (refs/heads/all/…). الثاني يستخدم Refspec مخصص لتخزين الحكام التي تم جلبها مباشرة في التسلسل الهرمي لتراجع الوجهة.

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

إذا تمكن Redmine من التعامل مع مستودع عاري ، فإنني أوصي باستخدام واحد. يستخدم git init --bare واسم ريبو ينتهي بـ .git. ايضا git config core.logAllRefUpdates true قد تكون فكرة جيدة (لأن هذا الافتراضيات إلى خطأ في مستودع عاري).

إلى جانب ال all/ بادئة في مساحات الأسماء ، فرق آخر بين هذا النهج وكامل --mirror استنساخ هو أن الحكام في الخارج refs/heads و refs/tags لن يتم جمعها. تعتبر معظم الحكام المشتركة الأخرى "محلية" لمستودع (وهذا هو السبب في عدم نسخها بواسطة استنساخ عادي). بعض الحكام الأخرى هي "فروع التتبع عن بُعد" (refs/remotes) ، بعض "Bisect" السجل (Bisect "(refs/bisect), git filter-branch النسخ الاحتياطية المرجعية "الأصلية" (refs/original)، إلى آخره. ربما لا شيء من هذه الأشياء الأخرى مهمة بالنسبة إلى Redmine. إذا كانت كذلك ، يمكن أيضًا إدراجها مع عمليات التقييم الإضافية.

إنشاء ارتباطات أولية إضافية

لترتيب فرع مع التزام أولي جديد ، انظر صفحة Gittips تحت كيفية إنشاء فرع جديد ليس له سلف. تتضمن اثنتان من الوصفات مستودعًا آخر تدفع منه أو إحضار فرع بعد المرور بخطوة init/add/الالتزام المعتادة (بالضبط ما تفعله الوصفات أعلاه بطريقة آلية).

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