سؤال

يبدو أن مفهوم التفريع يركز على إنشاء شوكة [غير] مستقرة للمستودع بأكمله للقيام بالتطوير عليه.هل هناك آلية لإنشاء فروع للملفات الفردية؟

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

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

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

المحلول

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

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

ارم، آسف.لم تكن هذه إجابة جيدة حقًا.ولكن لا يوجد حل جيد لهذا مع Subversion.نموذجها هو فرع ودمج.

يحرر:حسنًا، التوسع في ما قاله Crashmstr.يمكنك القيام بذلك:

svn cp $REP/trunk/file.h $REP/branched_files/file.h
svn co $REP/trunk
svn switch $REP/branched_files/file.h file.h

لكن واو! هل هذا عرضة للأخطاء.كلما قمت بإجراء svn st سترى هذا:

svn st
    S  file.h

صاخبة بعض الشيء ذلك.وعندما تريد تقسيم بعض الملفات أو الوحدات داخل مستودع مصدر كبير، فسيصبح الأمر فوضويًا للغاية.

في الواقع، من المحتمل أن يكون هناك مشروع لائق هنا لمحاكاة شيء مثل ملفات ClearCase المتفرعة مع خصائص svn والتبديل، وكتابة غلاف حول عميل svn القياسي للتعامل مع كل الفوضى.

نصائح أخرى

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

إذا قمت بإنشاء مجلد فروع منفصل في المستودع، فيمكنك نسخ ملفاتك المتفرعة هناك عبر أوامر من جانب الخادم:

svn copy svn://server/project/header.h svn://server/branched_files/header.h

ثم يمكنك تبديل هذا الملف لاستخدام branches_files مسار المستودع

هنا كيف أفهم مشكلتك.لديك الشجرة التالية:

time.h
time.c

وتحتاج إلى رفضه للعديد من البنى:

time.h is comon
time.c (for x386), time.c (for ia64), time.c (for alpha),...

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

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

اعتمادًا على بنية الكود المصدري الخاص بك، قد يكون هناك حل بالرغم من ذلك.تخيل أن لديك

 
/
/headers/
/headers/test.h
/source/
/source/test.c

ثم يمكنك التفرع / واستخدام svn:الخارجية ميزة لربط رؤوسك برأس صندوق السيارة.إنه يعمل فقط على الدلائل ويتحمل بعض القيود فيما يتعلق بالالتزام مرة أخرى بـ test.h (يجب عليك الانتقال إلى دليل الرأس حتى يعمل) ولكنه قد ينجح.

"فرع" التخريب هو مجرد نسخة من شيء ما في مستودعك.لذلك إذا أردت تفرع ملف ما عليك سوى القيام بما يلي:

svn copy myfile.c myfile_branch.c

لا أعتقد أن هناك فائدة كبيرة من تفرع ملف واحد؟لا توجد طريقة لاختباره مع رمز الجذع؟

يمكنك أن تأخذ تصحيحًا بدلاً من ذلك إذا كنت تريد التراجع عن التغييرات وتطبيقها لاحقًا.

هل أنت متأكد أنك حقا بحاجة إلى هذه الميزة في VCS الخاص بك ?

لماذا لا تستخدم معالج C المسبق و#ifdef لتتخلص من الكود الذي لا تحتاجه؟أو أي أداة مماثلة.

شيء مثل:

// foo.h:
void Foo();

// foo_win32.c
#ifdef _WIN32
void Foo()
{
   ...
}
#endif

// foo_linux.c
#ifdef _GNUC
void Foo()
{
   ...
}
#endif

في بعض الأحيان، إذا لم يكن الأمر مناسبًا، فهذا ليس الحل الصحيح.

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

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

تتمثل إحدى الطرق السهلة للسماح بدمج تغييرات قناة الاتصال تلقائيًا (والتي تحاكي نموذج Clear Case) في استخدام برنامج نصي ربط ما قبل الالتزام لدمج تغييرات قناة الاتصال قبل الالتزام. (في الواقع، يعد هذا دائمًا بمثابة استراتيجية جيدة لمنع انحراف التعليمات البرمجية).

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