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

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

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

К ТВОЕМУ СВЕДЕНИЮ, Я обычно требуется сделать резервную копию всех наборов изменений, которые находятся только в моем локальном РЕПО, прежде чем пытаться переписать потенциально опасную историю.

2 ответов


вы правы, что hg bundle обычно исключает секретные наборы изменений. Это потому, что он просто работает эквивалент hg outgoing и связывание этих наборов изменений.

Итак, некоторые обходные пути:

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

    $ hg bundle --base "parents(outgoing())"
    

    чтобы получить то, что вы хотите. The 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 call-передача неправильных параметров в 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].