زئبقي:هل تريد تضمين مجموعات التغييرات السرية في الحزمة؟

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

سؤال

باستخدام 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].

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