كيف يمكنني إدارة التعارضات مع وحدات git الفرعية؟

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

سؤال

لدي مشروع git superproject يشير إلى عدة وحدات فرعية وأحاول تأمين سير العمل لبقية أعضاء مشروعي للعمل فيه.

بالنسبة لهذا السؤال، لنفترض أن مشروعي الفائق يسمى supery ويتم استدعاء الوحدة الفرعية subby.(ثم ​​سأقوم بتبسيط ما أحاول القيام به... أنا لا أستخدم الفروع فعليًا للإصدارات، لكنني اعتقدت أنه سيكون من الأسهل طرحها كسؤال.)

فرعي الرئيسي supery لديه العلامة v1.0 من مشروع جيت subby المشار إليها باعتبارها وحدة فرعية.فرع supery مُسَمًّى one.one وقمت بتغيير مرجع الوحدة الفرعية للإشارة إلى العلامة v1.1 ل subby.

يمكنني العمل داخل كل فرع من هذه الفروع دون أي عوائق، ولكن إذا حاولت تحديث ملف one.one فرع مع التغييرات من master فرع أتلقى بعض التعارضات ولا أعرف كيفية حلها.

في الأساس بعد تشغيل أ git pull . master بينما في subby فرع، يبدو أنه يقوم بإنشاء وحدات فرعية إضافية.

قبل السحب/الدمج، أحصل على الاستجابة المطلوبة من git submodule من one.one فرع:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

ولكن بعد السحب، فإنه يضيف وحدات فرعية إضافية عندما أقوم بالتشغيل git submodule:

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

كيف يمكنني حذف/تجاهل مراجع الوحدة الفرعية غير المرغوب فيها وارتكاب تعارضاتي وتغييراتي؟أم أن هناك معلمة يمكنني استخدامها مع النسخة الأصلية git pull من شأنها أن تتجاهل الوحدات الفرعية الخاصة بي؟

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

المحلول

لم أر هذا الخطأ بالضبط من قبل.ولكن لدي تخمين حول المشكلة التي تواجهها.يبدو الأمر كذلك لأن master و one.one فروع من supery تحتوي على مراجع مختلفة لـ subby الوحدة الفرعية، عند دمج التغييرات من master بوابة لا تعرف أي المرجع - v1.0 أو v1.1 - يجب أن يتم حفظها ومتابعتها من قبل one.one فرع من supery.

إذا كان الأمر كذلك، فأنت بحاجة إلى تحديد المرجع الذي تريده وتنفيذ هذا التغيير لحل التعارض.وهو بالضبط ما تفعله مع إعادة ضبط يأمر.

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

نصائح أخرى

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

git reset HEAD subby
git commit

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

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

  1. يجري git status - قم بتدوين مجلد الوحدة الفرعية الذي يحتوي على تعارضات
  2. إعادة تعيين الوحدة الفرعية إلى الإصدار الذي تم الالتزام به آخر مرة في الفرع الحالي:

    git reset HEAD path/to/submodule

  3. في هذه المرحلة، لديك نسخة خالية من التعارضات من وحدتك الفرعية والتي يمكنك الآن تحديثها إلى الإصدار الأحدث في مستودع الوحدة الفرعية:

    cd path/to/submodule
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. والآن يمكنك ذلك commit ذلك والعودة إلى العمل.

أولاً، ابحث عن التجزئة التي تريد أن تشير إليها وحدتك الفرعية.ثم اركض

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'

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

كان لي هذه المشكلة مع git rebase -i origin/master إلى فرع.كنت أرغب في الحصول على نسخة الماجستير من مرجع الوحدة الفرعية، لذلك فعلت ببساطة:

git reset master path/to/submodule

وثم

git rebase --continue

ذلك حل مشكلتي.

حصلت على مساعدة من هذه المناقشة.في حالتي

git reset HEAD subby
git commit

عملت بالنسبة لي :)

حسنًا في الدليل الأصلي الخاص بي أرى:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

لذلك فعلت هذا للتو

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