マーキュリアル:シークレット変更セットをバンドルに含めますか?
-
10-12-2019 - |
質問
Mercurial を使用して、別のリポジトリにあることが知られていないすべての変更セットをバンドルするにはどうすればよいですか。 含む 秘密の変更セット?
知っている bundle
さんの --base
このオプションにはたまたまシークレット変更セットが含まれていますが、 --base
行動。(そして、シークレットチェンジセットが いつも に含まれる --base
しかし、 一度もない それなしで含まれています。別途オプションがあるんじゃないでしょうか?)
参考までに、私は通常、潜在的に危険な履歴の書き換えを試みる前に、ローカル リポジトリにのみ存在するすべての変更セットのバックアップを作成したいと考えています。
解決
あなたは正しいです hg bundle
通常、シークレット変更セットは除外されます。これは、以下と同等のものを実行しているだけであるためです。 hg outgoing
これらの変更セットをバンドルします。
したがって、いくつかの回避策があります。
シークレット変更セットの祖先として少なくとも 1 つのドラフトまたはパブリック送信変更セットがあることがわかっている場合は、次のように使用できます。
$ 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
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
.
フェーズ情報はバンドルに保存できないことに注意してください。バンドル形式は、フェーズ情報に対応するように変更されていません。
他のヒント
少なくとも1つのパブリックチェンジセットがあることがわかっている場合は、これを使用できます。
hg bundle -r "not public()" --base public()
.
Otohは、公開チェンジセットがない場合は機能しません。代わりにこれを使用します。
hg bundle -r "not public()" --base null
.
Martinの答えに関する問題は、それが発信に依存していることです。これは次にPush Repoへの直接接続に依存しています。あなたがそのレポへのインターネット接続を常に持っていないならば、これらの方法は私にとってうまく機能します。それはフェーズダンスよりもやや単純です。
パブリックチェッセスがあるかどうかのための1つのテスト:の出力をキャプチャすることです。
hg log -r public() -l 1 --template "{rev}"
.
の長さ、または[0-9]の存在をテストします。