سؤال

كيف أقوم بإعداد مشروع GIT يحتوي على مشاريع أخرى؟

على سبيل المثال أنا أعمل على تطبيق رسم الخرائط عبر الإنترنت. قمنا بتطوير أداة GPS جنبا إلى جنب مع الزي في SF. لقد طورت في وقت واحد برنامج نصي جيشيغ بايثون جنبا إلى جنب مع مصدر قلق مختلف (لا يهتم فقط بالجورتات). ملفاتنا الأساسية الخاصة بنا توحد الاثنين، والبناء عليها للحصول على التطبيق الذي نحتاجه.

يجب أن تكون كل من المشاريع في حد ذاته - الأشخاص الذين لديهم اهتمام GPS لديهم فقط لديهم اهتمام GPS - ولكن مشروع "الوالدين" الذي يتضمن جميع الآخرين يجب أن يكون متاحا كمشروع.

لقد أمضيت بعض الوقت في محاولة لفهم الأسفل، لكن يبدو أن لديها الكثير من الاستقلال لما هو مطلوب.

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

هل هذا قابل للقيام مع git؟ مع mercurial؟ هل المضيف (Github، Gitorious) يهم؟

لدي فكرة استخدام التخريب عن "الأصل" - تجاهل مجلدات .git، واستخدام GIT للمشاريع (تجاهل مجلدات .svn) - ولكن هذا ليس سوى منتجع آخر آخر.

تعديل:

لشرح لماذا لا أريد نقل الأسفل:

  1. عند تنزيل المستخدمين، لا يتضمن الرمز البريدي الأسود (هنا & هنا). كما حاول حتى المتعاونين إعداد المشروع. هذا هو سدادة المعرض.
  2. تجميد الأسفل - فهي لا (بسهولة) التقاط أحدث إصدار من المشروع الذي يتم الإشارة إليه.
  3. أسباب أخرى كما أشار في الإجابات الرائعة أدناه وفي هذا مونولوج في Nopugs..

سيتم دمج الدمج المشجعي (المقدمة لي بواسطة Paul، أدناه): من الصعب تحديث مصدر [من Subtree] من داخل المشروع، ويتم دمجه في هذا المصدر، وأن هذا المصدر يجب أن يقيم خارج مجلد "الجذر" المشروع. كونه تطبيق ويب، فمن الضروري أن تصل جميع صفحاتي داخليا إلى مجلد داخلها، ويتم ذلك الاختبار والتحديثات مباشرة داخل هذا المجلد. (آمل أن يكون هذا واضحا ومفيدا للآخرين.)

لا تزال تدرس إعداد "الفروع البعيدة" ولكن الأفكار الأخرى لا تزال موضع ترحيب.

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

المحلول

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

هناك احتمالان يحتفظان بإحتفاظ المشاريع الفرعية باعتباره ريبوس جيت مستقل الذي تسحبه من ريبو الرئيسي (التكامل) الخاص بك:

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

  • إعداد كل مشروع كفرع بعيد في الريبو الرئيسي ودمج من كل واحد منهم في master (التكامل) فرع يحتوي أيضا على الملفات الأساسية الخاصة بك. يتطلب هذا بعض الانضباط: إذا قمت بإجراء أي تغييرات على المشاريع الخارجية في Repo الرئيسية، فيجب أن تكون مصنوعة في الفرع ثم دمجها في الماجستير؛ وأنت لا تريد دمج في فروع المشروع. هذا يجعل من السهل إرسال التغييرات مرة أخرى إلى المشاريع الخارجية وهو استخدام مقبول تماما للفروع في GIT.

    يمكن التعامل مع البرامج النصية المشتركة الخاصة بك كفرع مستقل آخر في الدليل الرئيسي الخاص بك والتي يمكن لشركائك الخارجيين أن يسحبوا من فرع بعيد.

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

نصائح أخرى

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

لقد استخدمت git-subsodule و git-svn ويعمل بشكل جيد بشكل معقول. كانت الصالات السلبية:

  1. من أجل مواكبة مستودع المكتبة، اضطررت إلى إجراء الالتزام الجديد بتحديث "مؤشر مؤشر Git Gith" المنخفض. وذلك لأن تفعيل Git، على عكس SVN: EXTALESS، مثبتة مع بطاقة معرف معينة. قد لا يكون هذا الجانب السلبي الفعلي إذا كنت ترغب بالفعل في تحديد نسخة مستقرة، كنت أعمل برمز كان WIP.

  2. يتطلب السحب الأولي ل Repo Git مع نقل الخدمات خطوة إضافية مع "تنشط Git Init". هذه ليست مشكلة بالنسبة لك، ولكن بالنسبة للآخرين الذين يستخدمون التعليمات البرمجية الخاصة بك، سيتعين عليهم تذكرهم أو إخبارهم بإجراء هذه الخطوة قبل تجميع / تشغيل / اختبار التعليمات البرمجية الخاصة بك.

  3. إذا كنت تستخدم سطر الأوامر، فمن السهل إبرام مستودعك مع GIT-ADD. هذا لأنك تكتب git add subm<tab> لإكمال ل git add submodule, ، لكنه يكمل تلقائيا git add submodule/ - لاحظ مائل زائدة. إذا قمت بتنفيذ الأمر مع ShaSh الزائدة، فهذا يتم إنهاء المنقطات ويضيف كل ملفاتها الواردة بدلا من ذلك. يتم تخفيف هذا باستخدام GIT-GUI، git add . أو مجرد تدريب نفسك لحذف الشرطة (حدث لي أوقات كافية كنت تدربت نفسي لإزالته)

  4. يمكن أن يرتكب الخادمات التي يرتكبها الفوضى rebase git rebase. لقد نسيت التفاصيل الدقيقة، لكنها سيئة بشكل خاص إذا كان لديك تنويب "قذرة" وتشغيل Rebase التفاعلية. عادة مع شجرة قذرة لا يمكنك إعادة التدقيق، ولكن لا يتم التحقق من الأسود. وجود العديد من المناسبات التي يرتكبها في مجموعة Rebase تسبب أيضا مشاكل. تلتزم التجزئة المنسق الأخيرة بالاختيار الأول في قائمتك، وهذا أمر صعب للغاية لإصلاحه لاحقا. هذا يمكن أن يعمل حولها مع سير عمل أكثر حذرا (أي قررت بعناية متى تقوم بتنزح المناسبات الخاصة بك ...) ولكن يمكن أن يكون بيتا.

كانت خطوات ضبط هذا الأمر على غرار:

  1. يركض git svn clone https://project.svn.sourceforge.net/svnroot/project/project/trunk
  2. ادفع ذلك بمثابة مشروع جيت "حقيقي" على سبيل المثال github
  3. الآن في مستودع GIT الخاص بك، تشغيل git submodule init
  4. git submodule add git://github.com/project subproject
  5. ادفع ذلك أيضا، إلى ريبو الخاص بك هذه المرة.

هذا هو، أكثر أو أقل. سيكون لديك دليل جديد "Subproject"، والذي سيكون في قضيتك مكتبة جيولوجا.

في كل مرة تحتاج إلى تحديث رمز Geomaping، يمكنك تشغيل شيء مثل:

cd subproject
git svn rebase
git svn push  # this updates the git mirror of the subproject
cd ..
git add subproject # careful with the trailing slash!
git commit -m "update subproject"
git push # this pushes the commit that updates the subproject

لم أر الكثير من البرامج التعليمية على تدفق العمل المنطقي GIT، لذلك آمل أن يساعدك ذلك في اتخاذ القرار.

من الصغير لقد قرأت عن externals., ، يبدو أن ميناء من SVN "externals" إلى git.

هذا يحل بعض المشكلات مع نقل GIT، بما في ذلك التحديث إلى أحدث إصدار تلقائيا.

في حين ليس لدي أي خبرة مع SVN EXEVERELS أو مع هذا المشروع، فقد يكون ذلك حلا أفضل لبعض من أي من آخرين نشروا.

بدلا من ذلك، يمكن استخدام البرنامج التالي (يبدو أنه يمكن استخدامه مع Github). قد تكون وسيلة أخرى لبعض الجلد القطة:جديلة (Softpedia Page.)

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

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

استخراج بعض القسم الفرعي من مستودع كيان منفصل خاص به مع الحفاظ على تاريخ الإصدار صعب في GIT، وبالتالي فمن الجيد أن تخطط للمستقبل.

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

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