Непостоянный:Включить секретные наборы изменений в пакет?
-
10-12-2019 - |
Вопрос
Используя 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].