تم إعادة إنشاء Git على فرع سيتم إنشاؤه لاحقًا

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

  •  06-07-2019
  •  | 
  •  

سؤال

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

أحد المضاعفات هو أنني كنت أعمل بالفعل في جهاز افتراضي وبالنسبة للعديد من الالتزامات لم أدرك أنني لم أقم بتعيين إدخالات تكوين user.name وuser.email بحيث تكون الالتزامات من المستخدم المحلي لجهاز vm، وهو أمر لطيف من غريب.هل سيكون من الأفضل جمع كل التغييرات التي أجريتها في ملفات مختلفة ثم تطبيقها أعلى الفرع الجديد بمجرد إنشائه؟

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

سؤال أخير هو أنه إذا قمت باستيراد مستودع SVN عبر git svn (لقد تحققت للتو ويبدو أنه يعمل الآن) ولكني لا أقوم بإضافة ملف مؤلفين، هل سأتمكن لاحقًا من إعادة أساس تغييراتي إلى فرع مستورد بشكل صحيح باستخدام ملف مؤلفين؟

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

رقم SVN:

\dir\codez

شخص سخيف:

\codez

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

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

المحلول

لم أستخدم git svn clone لأنني بالخارج واتصال الإنترنت الخاص بي غريب ويتطلب وكيلاً لـ HTTP

يجب أن تعمل إذا قمت بتعيين

http_proxy=http://username:passwword@pprroxyHost:proxyPort

أو يمكنك المحاولة

http_proxyUser=username
http_proxyPassword=password
http_proxyHost=aProxyHost
http_proxyPort=aProxyPort

هل ستعمل git rebase بشكل صحيح لهذا؟

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

لم أدرك أنني لم أقم بتعيين إدخالات تكوين user.name وuser.email

نظرًا لأنك لم تنشر بعد، يمكنك استخدام ملف filter-branch لتعديل التزاماتك وتغيير اسم المستخدم والبريد الإلكتروني

القليل من النص sh يمكن أن يساعد

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        aSystemUserName) n="TheActual Name" ; m="TheActual@mailAddress" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

اتصل بهذا البرنامج النصي من الريبو الخاص بك وقد انتهيت.

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

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

  • الرمز من SVN
  • الرمز الذي لم تحصل عليه مباشرة من مستودع SVN.

هل سأتمكن لاحقًا من إعادة أساس تغييراتي إلى فرع مستورد بشكل صحيح باستخدام ملف المؤلفين؟

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

نصائح أخرى

git-rebase يعتمد على وجود التزام مشترك في مكان ما في التاريخ.ويحدث أيضًا داخل مستودع واحد.يبدو أنك ستنتهي في موقف (أ) يكون فيه الريبو المستورد لـ git-svn الجديد منفصلاً عن الريبو الخاص بك، و(ب) لن يكون هناك أي التزام مشترك بين الاثنين.من المحتمل أن ينتهي بك الأمر إلى الحاجة إلى القيام بذلك عبر التصحيحات، ولكن يمكن لـ git مساعدتك في ذلك.تحقق من صفحات manpages ل git-format-patch و git-am.يمكن للأول إنشاء سلسلة من التصحيحات من مجموعة من الالتزامات، ويمكن للثاني أن يأخذ هذه السلسلة من التصحيحات ويطبقها - وسيتم الحفاظ على جميع رسائل الالتزام وما شابه.

سيوفر لك هذا فرصة لإصلاح مشكلة user.name/email لديك - يمكنك ببساطة تعديلها في رؤوس التصحيحات، والتأكد من ضبطها بشكل صحيح في الريبو المستورد الجديد قبل تطبيق التصحيحات الخاصة بك!

أفضل طريقة للتعامل مع مكان البدء القديم ("المراجعة الأقدم ..."هذا لم يكن حتى رأس SVN") ربما سيكون:

  • جعل SVN repo في حالة جيدة، مع الالتزام بجميع التغييرات
  • قم باستيراده باستخدام git-svn
  • قم بإنشاء فرع والتحقق منه في التزام قديم حيث بدأت العمل منه
  • قم بتطبيق سلسلة التصحيح الخاصة بك
  • قم بدمج هذا الفرع في الفرع الرئيسي، المتوافق مع رأس SVN الحالي

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

كان هناك الكثير من الأسئلة هنا، لذا لا تتردد في التعليق وطلب المزيد إذا فاتني أشياء.

ويمكنك إنشاء فرع جديد لم يولد بعد مع الأدوات ذات المستوى المنخفض:

$ git symbolic-ref HEAD refs/heads/new_branch

ومع بوابة الحديثة يمكنك rebase فرع كله باستخدام الخيار --root من "rebase بوابة".

وهذا قد أو قد لا تساعد في وضعك. YMMV.

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