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