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