باستخدام Mercurial، كيف يمكنني "ضغط" سلسلة من مجموعات التغييرات في مجموعة واحدة قبل الدفع؟

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

سؤال

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

لدي الآن 3 مجموعات تغييرات أود حقًا دفعها إلى المستودع البعيد كمجموعة تغييرات واحدة تحتوي على رسالة "تنفيذ الميزة X"، على سبيل المثال.

كيف يمكنني القيام بذلك دون الكثير من المتاعب؟أعتقد أنه يمكنني القيام بذلك باستخدام التصحيحات، لكن يبدو أن الأمر يتطلب الكثير من العمل.

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

المحلول

وماذا عن طي تمديد ؟

نصائح أخرى

ال histedit التمديد هو بالضبط ما تبحث عنه.

hg histedit -o

أو

hg histedit --outgoing

سيظهر قائمة بمجموعات التغييرات الصادرة.من القائمة يمكنك

  • قم بطي مجموعتين أو أكثر من مجموعات التغييرات لإنشاء مجموعة تغييرات واحدة
  • قم بإسقاط مجموعات التغييرات وإزالتها من السجل
  • أعد ترتيب مجموعات التغييرات كيفما تشاء.

سيطالبك histedit برسالة الالتزام الجديدة لمجموعات التغييرات المطوية والتي يتم تعيينها افتراضيًا على الرسالتين مع فصل " *** " بينهما.

يمكنك أيضًا الحصول على نتائج مماثلة باستخدام ملحق mq، لكن الأمر أكثر صعوبة.

يمكنك أيضًا استخدام ملحق الانهيار للقيام بالطي فقط، ولكنه لا يوفر واجهة مستخدم جميلة ولا يوفر طريقة لتحرير رسالة الالتزام الناتجة.يتيح تحرير رسالة الالتزام الناتجة أيضًا تنظيف الرسالة النهائية، وهو أمر أنتهي دائمًا من استخدامه.

نعم يمكنك فعل ذلك بالتصحيحات:لنفترض أن عملك موجود في مجموعات التغييرات من 100 إلى 110، ضمنًا

  1. إنشاء التصحيح:

    % hg export -o mypatch 100:110 --git

  2. التحديث إلى 99:

    % hg update 99

  3. قم بتطبيق التصحيح باستخدام --no-commit (وإلا فستستعيد جميع مجموعات التغييرات الخاصة بك):

    % hg import --no-commit mypatch

  4. تنفيذ جميع التغييرات مرة واحدة:

    % hg commit

  5. لديك الآن رأسان (110 و111) يجب أن يكونا متكافئين من حيث الملفات التي ينتجانها في دليل العمل الخاص بك - ربما قم بتمييزهما من أجل التعقل قبل إزالة الملفات القديمة:

    % hg strip 100

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

إذا كنت تستخدم TortoiseHg، فيمكنك فقط تحديد مراجعتين (استخدم CTRL لتحديد المراجعات غير اللاحقة)، ثم انقر بزر الماوس الأيمن وحدد "ضغط التاريخ".

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

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

وبلدي الأسلوب المفضل استخدام MQ لهذا للطي يستخدم TortoiseHg <لأ href = "http://unitstep.net/blog/2011/01/26/folding-changesets-with-the-mercurial-queues-extension/ "يختلط =" نوفولو noreferrer "> كما هو موضح هنا . ومع ذلك، فإنه يمكن بسهولة أن يتم ذلك من سطر الأوامر كما يلي:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

و(قد يكون هناك طريقة أفضل للقيام بهذه الخطوة qfold، لكنني لست على علم به، وأنا عادة استخدام TortoiseHg لتلك العملية.)

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

hg collapse و hg histedit هي أفضل الطرق.أو بالأحرى، ستكون أفضل الطرق، إذا عملت بشكل موثوق...أنا أخذت histedit لتتعطل مع تفريغ المكدس خلال ثلاث دقائق. Collapse ليس هذا أفضل بكثير.

أعتقد أنني قد أشارك اثنين من BKMs الآخرين:

  1. hg rebase --collapse

    يتم توزيع هذا الامتداد مع Mercurial.لم أواجه مشاكل معها بعد.قد تضطر إلى لعب بعض الألعاب للتغلب عليها hg rebase القيود - في الأساس، لا يحب إعادة التأسيس إلى سلف على نفس الفرع، المسمى أو الافتراضي، على الرغم من أنه يسمح بذلك في حالة إعادة التأسيس بين الفروع (المسماة).

  2. نقل المستودع (foo/.hg) إلى دليل العمل (bar) وملفاته.ليس العكس.

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

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

يعمل هذا طالما أن المستودعات الحقيقية، .hg الأشجار مستقلة عن دليل العمل وملفاته.

إذا لم يكونوا مستقلين..

ولقد استعملت أبدا زئبقي، ولكن هذا يبدو كثيرا مثل ما مارتن فاولر كان يتحدث عن على بلوق له منذ وقت ليس ببعيد:

http://martinfowler.com/bliki/MercurialSquashCommit.html

لماذا لا مجرد قيادة hg strip --keep؟

وبعد ذلك يمكنك تنفيذ كافة التغييرات باعتبارها واحدة يرتكبها.

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

وافترض أن لديك اثنين THIS غير منشورة وTHAT يرتكب في زئبقي ومثلهم للانضمام إلى واحدة ارتكاب في THIS نقطة ::

... --> THIS --> ... --> THAT --> ... --> LAST

وتأكد من أن يرتكب بك لا يتم نشر ::

$ hg glog -r "draft() & ($THIS | $THAT)"

وتحديث لLAST ارتكاب ::

$ hg up

وواستيراد يرتكب ما يصل الى THIS إلى MQ ::

$ hg qimport $THIS::.

والامم المتحدة وتطبيق جميع البقع وتطبيق THIS الأول فقط ::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

وتاريخ مع THAT ::

$ hg qfold $THATNAME

ملاحظة للعثور على اسم استخدام THATNAME ::

$ hg qseries

وتطبيق جميع البقع ونقلها إلى مستودع التاريخ ::

$ hg qpush -a
$ hg qfinish -a

وبلدي بلوق وظيفة في الموضوع هو الانضمام اثنين من يرتكب في زئبقي .

نعم، strip --keep يعمل لمسألة المؤلف. ولكنه كان مختلفا بعض الشيء عن الآخرين، على سبيل المثال، إذا كان لديك نسخة 1-30 ولكن نريد فقط أن ينهار النسخة 12-15. حلول أخرى العمل ولكن لا strip --keep.

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