Mercurial: включить секретные наборы изменений в комплект? - PullRequest
6 голосов
/ 09 марта 2012

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

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

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

Ответы [ 2 ]

5 голосов
/ 10 марта 2012

Вы правы, что 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.

Обратите внимание, что информация о фазе не может быть сохранена в пакетах - формат пакета не был изменен для размещенияэто.

1 голос
/ 15 ноября 2014

Если вы знаете, что есть хотя бы один общедоступный набор изменений, вы можете использовать это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...