سؤال

نحن نستخدم git-svn لإدارة فروع مستودع SVN.نحن نواجه المشكلة التالية:بعد عدد من عمليات الالتزام من قبل المستخدم X في الفرع، يرغب المستخدم Y في استخدام git-svn لدمج التغييرات في الفرع إلى صندوق الاتصال.المشكلة التي نراها هي أن رسائل الالتزام لجميع عمليات الدمج الفردية تبدو كما لو أنها تم إجراؤها بواسطة المستخدم Y، في حين أن التغيير الفعلي في الفرع تم إجراؤه بواسطة المستخدم X.

هل هناك طريقة للإشارة إلى git-svn أنه عند الدمج، استخدم رسالة/مؤلف الالتزام الأصلي لتغيير معين بدلاً من الشخص الذي يقوم بالدمج؟

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

المحلول

توصي صفحة دليل git-svn بذلك لا تستخدم الدمج.""يوصى بتشغيل git-svn fetch and rebase (وليس السحب أو الدمج)"".بعد قولي هذا، يمكنك أن تفعل ما تريد :-)

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

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

لقد حاولت للتو باستخدام git 1.6.0.2 و"يفقد" المعلومات مقارنة بإجراء نفس العملية باستخدام svn merge.في svn 1.5، تمت إضافة ميزة جديدة إلى طرق التسجيل والتعليقات التوضيحية، بحيث يُخرج svn log -g الموجود على قناة الاتصال شيئًا كهذا للدمج:

------------------------------------------------------------------------
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line

Merged release-1.0 into trunk
------------------------------------------------------------------------
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line
Merged via: r5

Return 1
------------------------------------------------------------------------
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines
Merged via: r5

Create a branch

هنا، يلتزم Y بـ r5، الذي يتضمن التغييرات من X على الفرع إلى الصندوق.تنسيق السجل ليس رائعًا حقًا، ولكنه يأتي في حد ذاته على svnلوم -g:

       2          Y int main()
       2          Y {
G      4          X   return 1;
       2          Y }

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

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

تحديث:لقد جربت هذا للتو مع git 1.7.1 لمعرفة ما إذا كان هناك أي تقدم في هذه الأثناء.الخبر السيئ هو أن الدمج داخل git لا يزال لا يملأ قيم svn:mergeinfo، لذلك git merge تليها git svn dcommit لن يتم تعيين svn:mergeinfo وستفقد معلومات الدمج إذا كان مستودع Subversion هو المصدر الأساسي، وهو على الأرجح.والخبر السار هو أن git svn clone يقرأ خصائص svn:mergeinfo لإنشاء سجل دمج أفضل، لذلك إذا كنت تستخدمه svn merge بشكل صحيح (يتطلب دمج الفروع الكاملة) فسيبدو استنساخ git صحيحًا لمستخدمي git.

نصائح أخرى

يمكنك استخدام الطعوم لتعليم git حول عمليات الدمج التي لم تتم الإشارة إليها في كائن الالتزام المعني.

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts

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

git svn find-rev r$revnum $branch

بسرعة، لديك جميع المعلومات الثلاث التي تحتاجها لإنشاء الكسب غير المشروع.

حاول استخدام خيارات --add-author-from و --use-log-author لـ git-svn.

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