Mercurial: включить секретные наборы изменений в комплект?

Используя Mercurial, как я могу связать все наборы изменений, которые, как известно, не находятся в другом репозитории, включая секретные наборы изменений?

я знаю bundle"s --base вариант включает в себя секретные наборы изменений, но я не хочу --base поведение. (И кажется странным, что секретные наборы изменений всегда включены в --base но никогда не включаются без него. Разве не должно быть отдельного варианта?)

К вашему сведению, я обычно хочу сделать резервную копию всех наборов изменений, которые есть только в моем локальном репо, прежде чем пытаться переписать потенциально опасную историю.

2 ответа

Решение

Вы правы в том, что 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 не должно означать, что вы потеряете всю информацию о секретных ревизиях. Также обратите внимание, что поскольку у секретных наборов изменений есть только секретные потомки, при использовании этого метода не происходит потери информации.

    Вы можете превратить это в псевдоним оболочки:

    [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].

Другие вопросы по тегам