زئبقي:هل تريد تضمين مجموعات التغييرات السرية في الحزمة؟
-
10-12-2019 - |
سؤال
باستخدام Mercurial، كيف يمكنني تجميع جميع مجموعات التغييرات التي لا يُعرف أنها موجودة في مستودع آخر، مشتمل مجموعات التغييرات السرية؟
أنا أعرف bundle
'س --base
يحدث أن يتضمن الخيار مجموعات التغييرات السرية، لكنني لا أريد --base
سلوك.(ويبدو من الغريب على نحو غير عادي أن تكون مجموعات التغييرات السرية دائماً المتضمنة --base
ولكن ل أبداً متضمنة بدونها.ألا ينبغي أن يكون هناك خيار منفصل؟)
لمعلوماتك، أرغب عادةً في عمل نسخة احتياطية لجميع مجموعات التغييرات الموجودة فقط في الريبو المحلي الخاص بي قبل محاولة إعادة كتابة السجل الذي يحتمل أن يكون خطيرًا.
المحلول
أنت على حق في ذلك hg bundle
سوف يستبعد عادةً مجموعات التغييرات السرية.هذا لأنه يعمل فقط بما يعادل hg outgoing
وتجميع مجموعات التغييرات هذه.
لذلك بعض الحلول:
إذا كنت تعلم أن لديك مسودة واحدة على الأقل أو مجموعة تغييرات عامة صادرة كسلف لمجموعات التغييرات السرية الخاصة بك، فيمكنك استخدام
$ hg bundle --base "parents(outgoing())"
لتحصل على ما تريد.ال
outgoing()
سوف يقوم revset باختيار المسودة المفقودة ومجموعات التغييرات العامة وparents(outgoing()
سوف تكون قواعد مناسبة.منذ أن تستخدم--base
تحصل على جميع النسل (العامة، المسودة، والسرية) من هذه القواعد.يمكنك مؤقتًا إنشاء مسودة لمجموعات التغييرات السرية الخاصة بك، وتجميعها، ثم وضع علامة عليها سرية مرة أخرى:
$ secret=$(hg log --template "{rev} " -r "secret()"); \ hg phase -d $secret; \ hg bundle out.hg; \ hg phase -f -s $secret
(أستخدم Zsh وكان علي أن أستخدمه هناك
${=secret}
بدلاً من$secret
لأن Zsh لا يقوم بتقسيم الكلمات عند توسيع المعلمة بشكل افتراضي.)من المهم ربط الأوامر بـ
;
بدلاً من&&
نظرًا لأنك سترغب في إعادة ضبط المراحل بغض النظر عما يحدث فيhg bundle
استدعاء - تمرير معلمات خاطئة إلىhg bundle
لا يعني ذلك أنك ستفقد كافة المعلومات المتعلقة بمجموعات التغييرات السرية.لاحظ أيضًا أنه بما أن مجموعات التغييرات السرية لها فروع سرية فقط، فلا يوجد فقدان للمعلومات باستخدام هذه التقنية.يمكنك تحويل هذا إلى اسم مستعار لـ Shell:
[alias] bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); hg phase -d $secret; hg bundle $@; hg phase -f -s $secret
ال
$@
يتم توسيعه بواسطة Mercurial قبل استدعاء الاسم المستعار وهذا يتيح لك إدراج الوسائط اللازمة لـhg bundle
.
لاحظ أنه لا يمكن تخزين معلومات المرحلة في حزم - لم يتم تغيير تنسيق الحزمة لاستيعابها.
نصائح أخرى
إذا كنت تعلم أن هناك مجموعة تغييرات عامة واحدة على الأقل، فيمكنك استخدام هذا:
hg bundle -r "not public()" --base public()
OTOH، لن ينجح هذا في حالة عدم وجود مجموعات تغييرات عامة، استخدم هذا بدلاً من ذلك:
hg bundle -r "not public()" --base null
تكمن مشكلة إجابة مارتن في أنها تعتمد على الصادر، والذي يعتمد بدوره على الاتصال المباشر بمستودع الدفع.إذا لم يكن لديك دائمًا اتصال بالإنترنت لهذا الريبو، فهذه الطرق تعمل جيدًا بالنسبة لي.إنها أيضًا أبسط إلى حد ما من رقصة المرحلة.
أحد الاختبارات لمعرفة ما إذا كانت هناك أية مجموعات تغييرات عامة هو التقاط مخرجات:
hg log -r public() -l 1 --template "{rev}"
واختبار طوله أو وجود [0-9].