ما هي أسهل طريقة ارتكاب دفع ملف واحد مع ترك تعديلات أخرى وحدها ؟
-
02-07-2019 - |
سؤال
أنا جديدة نسبيا لم فريقي تحاول بها الآن كبديل عن التخريب.
كيف يمكنني الالتزام و ادفع ملف واحد إلى مستودع آخر في حين ترك تعديلات أخرى في دليل العمل غير ملتزم (أو على الأقل ليس دفعت إلى أخرى مستودع)?
هذا يحدث لنا مع قاعدة بيانات الهجرة.نحن نريد أن ارتكاب الهجرة إلى "عنصر تحكم مصدر" حتى ديسيبل يمكن عرض وتحرير بينما نحن نعمل على تعديلات قانون للذهاب جنبا إلى جنب مع قاعدة بيانات الهجرة.التغييرات ليست حتى الآن على استعداد للذهاب لذلك نحن لا نريد أن دفع كل منهم.
في التخريب, كنت ببساطة:
svn add my_migration.sql
# commit only the migration, but not the other files I'm working on
svn commit -m "migration notes" my_mygration.sql
ومواصلة العمل محليا.
هذا لا يعمل مع الزئبقي كما انا عندما دفع به إلى مستودع ، إذا كانت هناك تغييرات على أنه لم سحبها إلى أسفل ، فإنه يريد مني أن سحب عليهم ، ودمجها ، لارتكاب هذا الدمج إلى مستودع.يرتكب بعد الدمج لا تسمح لك بحذف الملفات بحيث يجبرك على ارتكاب كل شيء في المستودع المحلي.
أسهل شيء يمكنني معرفة ارتكاب الملف إلى مستودع استنساخ بلدي المحلية مستودع, جلب أي تغييرات جديدة من الفعلية مستودع ، ودمجها وارتكاب أن دمج و منهم دفع بلدي التغييرات.
hg add my_migration.sql
hg commit -m "migration notes" my_migration.sql
cd ..
hg clone project project-clone
cd project-clone
hg fetch http://hg/project
hg push http://hg/project
يعمل هذا ، ولكن بدا الامر وكأننا أنا في عداد المفقودين شيء أسهل طريقة لإخبار الزئبقي تجاهل الملفات في دليل العمل, مجرد دمج و إرسال الملفات جنبا إلى جنب.وأظن الزئبقي طوابير يمكن أن تفعل هذا ، ولكن لا بشكل كامل جروك mq بعد.
المحلول
هناك الزئبقي الميزة التي تنفذ الرف و استعادة الأوامر التي تعطيك وسيلة تفاعلية لتحديد التغييرات إلى تخزين بعيدا حتى وقت لاحق: تأجيل.
ثم يمكنك hg shelve
و hg unshelve
مؤقتا لتخزين التغييرات بعيدا.فإنه يتيح لك العمل في "التصحيح كتلة" مستوى انتقاء واختيار العناصر إلى الرف بعيدا.لم تظهر إلى تأجيل ملف قد سرد مضيفا أن الملفات بالفعل في الريبو مع بعض التعديلات.
يتم تضمين مع الزئبقي باعتبارها "التمديد" الذي يعني فقط لديك لتمكينه في الزئبق config.
ملاحظات حقا الإصدارات القديمة من الزئبقي (قبل تأجيل أدرج -- هذا لم يعد ضروريا):
أنا لم أرى أي تعليمات التثبيت مع بعض غوغلينغ, حتى هنا هو الجمع بين الأشياء التي اعتدت على هذا العمل:
الحصول عليه مع:
hg clone http://freehg.org/u/tksoh/hgshelve/ hgshelve
الملف فقط (حاليا) في المشروع hgshelve.py الملف.
تعديل ~/.hgrc لإضافة تأجيل التمديد ، لافتا إلى حيث كنت المستنسخة الريبو:
[extensions]
hgshelve=/Users/ted/Documents/workspace/hgshelve/hgshelve.py
نصائح أخرى
لقد كان ما يقرب من 2 سنوات منذ أنا أصلا طرح هذا السؤال.أود أن تفعل ذلك بطريقة مختلفة الآن (كما ذكرت في التعليق أعلاه السؤال أعلاه).ماذا أفعل الآن سيكون بدلا ارتكاب بلدي التغييرات إلى ملف واحد في بلدي المحلية الريبو (يمكنك استخدام الزئبق سجل التمديد فقط ارتكاب قطعة من الملف):
hg commit -m "commit message" filename
ثم طرد.
hg push
إذا كان هناك تعارض لأن آخر التغييرات التي طرأت على الريبو أنني بحاجة إلى دمج أفضل تحديث الوالدين مراجعة (شهدت مع "hg الآباء -r ." إذا كنت لا تعرف ما هو عليه) ، ارتكاب بلدي تغييرات أخرى هناك حتى لقد حصلت على 2 رؤساء.ثم العودة إلى الأصل ملف واحد ارتكاب سحب/دمج التغييرات في هذا الإصدار.ثم دفع من التغييرات مع
hg push --rev .
دفع بها سوى ملف واحد و دمج تلك المراجعة.ثم يمكنك دمج اثنين من رؤساء لديك محليا.
وبهذه الطريقة يتخلص من mq الأشياء و إمكانية رفض الكتل و يبقى كل شيء تتبعها عنصر تحكم مصدر.يمكنك أيضا "hg قطاع" التنقيحات قبالة إذا كنت في وقت لاحق تقرر أنك لا تريد لهم.
tl;dr:بلدي الأصلي تفسير تبدو معقدة لكن أتمنى أن كامل يشرح كيفية استخدام التصحيح الانتظار.هنا هو نسخة قصيرة:
$ hg qnew -m "migration notes" -f migration my_migration.sql
$ hg qnew -f working-code
# make some changes to your code
$ hg qrefresh # update the patch with the changes you just made
$ hg qfinish -a # turn all the applied patches into normal hg commits
الزئبقي طوابير يجعل هذا النوع من الشيء نسيم ، ويجعل أكثر تعقيدا التلاعب changesets ممكن.يستحق التعلم.
في هذه الحالة ربما كنت ترغب في حفظ ما في الدليل الحالي قبل إنزال التغييرات:
# create a patch called migration containing your migration
$ hg qnew -m "migration notes" -f migration.patch my_migration.sql
$ hg qseries -v # the current state of the patch queue, A means applied
0 A migration.patch
$ hg qnew -f working-code.patch # put the rest of the code in a patch
$ hg qseries -v
0 A migration.patch
1 A working-code.patch
الآن دعونا نفعل بعض الأعمال الإضافية على العامل التعليمات البرمجية.انا ذاهب للحفاظ على القيام qseries
فقط أن تكون صريحة ، ولكن مرة واحدة يمكنك بناء العقلية نموذج التصحيح طوابير, لن يكون لديك للحفاظ على النظر في قائمة.
$ hg qtop # show the patch we're currently editing
working-code.patch
$ ...hack, hack, hack...
$ hg diff # show the changes that have not been incorporated into the patch
blah, blah
$ hg qrefresh # update the patch with the changes you just made
$ hg qdiff # show the top patch's diff
لأن كل ما تبذلونه من العمل يتم حفظها في التصحيح طابور الآن يمكنك unapply تلك التغييرات واستعادتها بعد أن كنت قد سحبت في جهاز التحكم عن بعد التغييرات.عادة unapply كل بقع, فقط افعل hg qpop -a
.فقط لإظهار تأثير على التصحيح الانتظار سوف البوب لهم قبالة واحد في وقت واحد.
$ hg qpop # unapply the top patch, U means unapplied
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qtop
migration.patch
$ hg qpop
$ hg qseries -v
0 U migration.patch
1 U working-code.patch
في هذه المرحلة, كما لو كان هناك أي تغييرات في الدليل الخاص بك.لا hg fetch
.الآن يمكنك دفع التصحيح الخاص بك الانتظار التغييرات مرة أخرى ، ودمجها إذا كان هناك أي تضارب.هذا هو المفهوم تشبه إلى حد ما حكاية ريبس.
$ hg qpush # put the first patch back on
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qfinish -a # turn all the applied patches into normal hg commits
$ hg qseries -v
0 U working-code.patch
$ hg out
migration.patch commit info... blah, blah
$ hg push # push out your changes
عند هذه النقطة كنت قد دفعت الهجرة مع الحفاظ على آخر التغييرات المحلية.الخاص بك تغييرات أخرى في التصحيح في قائمة الانتظار.لقد كنت التنمية الشخصية باستخدام التصحيح طابور مساعدتي في بنية التغييرات بلدي أفضل.إذا كنت ترغب في التخلص من التصحيح الانتظار والعودة إلى النمط العادي يجب أن تصدير التغييرات إعادة استيراد لهم في "طبيعية" الزئبقي.
$ hg qpush
$ hg qseries -v
0 A working-code.patch
$ hg export qtip > temp.diff
$ rm -r .hg/patches # get rid of mq from the repository entirely
$ hg import --no-commit temp.diff # apply the changes to the working directory
$ rm temp.diff
أنا المدمنين بشكل كبير إلى التصحيح طوابير من أجل التنمية ، mq
هو واحد من اجمل تطبيقات هناك.القدرة على صياغة العديد من التغييرات في وقت واحد حقا لا يحسن كيف تركز وتنظيف يرتكب هي.يستغرق بعض الوقت لتعتاد على ، ولكن سارت الامور بشكل جيد بشكل لا يصدق مع DVCS سير العمل.
خيار آخر إذا كنت لا تريد أن تعتمد على امتداد هو الحفاظ على نسخة من المنبع مستودع محليا يمكنك فقط استخدام هذه الأنواع من المهام التكامل.
في المثال الخاص بك ، يمكنك ببساطة سحب/دمج التغيير في التكامل/المنبع مستودع ودفعها مباشرة إلى الملقم البعيد.
ما يمكنني استخدام عموما هو استخدام ارتكاب ملف واحد :
hg commit -m "commit message" filename
في القضية في وقت لاحق ، يجب دمج الصراع وأنا لا تزال غير مستعدة لارتكاب بلدي التغييرات اتبع الخطوات التالية:
1) إنشاء ملف التصحيح.
hg diff > changes.patch
2) تعود كل المعلقة الخاصة بك غير ملتزم التغييرات إلا بعد التحقق من ملف patch.
hg revert --all
3) سحب وتحديث دمج أحدث مراجعة
hg pull -u
hg merge
hg commit -m "local merge"
4) الآن ببساطة استيراد التصحيح الخاص بك على التغييرات.
hg import --no-commit changes.patch
تذكر أن استخدام -لا-ارتكاب العلم من السيارات ارتكاب التغييرات.
منذ أن قلت أسهل, أنا غالبا ما تستخدم hg commit -i
(- التفاعلية) حتى عند ارتكاب كل الملفات.مع --interactive
يمكنك فقط اختيار ملف(ق) التي تريد بدلا من كتابة المسار بالكامل(s) على سطر الأوامر.اضاف باعتبارها مكافأة حتى يمكنك بشكل انتقائي تشمل/استبعاد قطع داخل الملفات.
وبعد ذلك فقط hg push
لدفع تلك التي تم إنشاؤها حديثا يرتكبها.
أضع المزيد من التفاصيل حول استخدام hg commit --interactive
في هذا الجواب: https://stackoverflow.com/a/47931672/255961