هل تريد دفع التغييرات تلقائيًا إلى مجلد واحد في مستودع git إلى github؟

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

سؤال

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

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

المحلول

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

إذا كان لديك مستودع يحتوي على الملفات "العامة" ومستودع يحتوي على الملفات "الخاصة"، فيمكنك إضافة رابط git إلى الريبو "العام" لدفع الالتزامات تلقائيًا، والحفاظ على خصوصية الريبو الخاص.

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

لديك عدد من الخيارات لحل هذه المواقف:

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

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

لتقسيم المجلد "العام" إلى مستودعه الخاص، قم بإنشاء فرع "عام" جديد من فرعك "المدمج"، واستخدم git filter-branch عليه لجعل الفرع "العام" الجديد يحتوي فقط على عناصر من المجلد "العام".يعرض قسم "الأمثلة" المثال الصحيح لعامل تصفية الدليل الفرعي).بعد ذلك، سيكون لديك الفرع "المدمج" القديم الذي يحتوي على المجلد "العام" والأشياء الخاصة الموجودة فيه، والفرع "العام" الجديد الذي يحتوي على المجلد "العام" فقط.

كن على علم بأن على سبيل المثال.لا تزال رسائل الالتزام الموجودة في الفرع "العام" الجديد تحتوي على معلومات "خاصة".لذا، يجب عليك مراجعة جميع رسائل الالتزام، وفحصها بحثًا عن معلومات خاصة، وربما تنقيح تلك المعلومات الخاصة، على سبيل المثال.مع git rebase -i.

تحديث: [الدفعة اللاحقة لـ فقط ربما لن ينقل الفرع "العام" ولا شيء آخر أي معلومات أخرى، لذلك ربما لا تكون هناك حاجة إلى تنظيف الريبو هذا.] إذا كنت بحاجة إلى إجراء أي تنقيح، فستحتاج إلى إزالة الإصدارات القديمة غير المنقحة من الريبو باستخدام git gc (ربما مع --prune=0 و --aggressive الخيارات - ولكن لا يمكنني العثور على إجابة SO مع مزيد من المعلومات حول ذلك).

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

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

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

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

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

نصائح أخرى

githook للدفع على ارتكاب.

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