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

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

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

    [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

Проблема с ответом Мартина заключается в том, что он полагается на исходящий, который, в свою очередь, полагается на прямое подключение к push-репозиторию.Если у вас не всегда есть подключение к Интернету для этого репозитория, эти методы хорошо работают для меня.Это также несколько проще, чем фазовый танец.

Одним из тестов на наличие каких-либо общедоступных наборов изменений является захват выходных данных:

hg log -r public() -l 1 --template "{rev}"

и проверьте его длину или наличие [0-9].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top