8

Mercurial を使用して、秘密の変更セットを含め、別のリポジトリにあることがわかっていないすべての変更セットをバンドルするにはどうすればよいですか?

bundle--baseオプションにたまたま秘密の変更セットが含まれていることは知っていますが、その--base動作は望ましくありません。(そして、秘密の変更セットが常に含まれているのに、それなしで--base決して含まれないというのは非常に奇妙に思えます。別のオプションがあるべきではありませんか?)

参考までに、潜在的に危険な履歴の書き換えを試みる前に、ローカル リポジトリにのみあるすべての変更セットのバックアップを作成したいと考えています。

4

2 に答える 2

5

hg bundle通常は秘密の変更セットを除外するのは正しいです。これは、hg outgoingこれらの変更セットと同等のものを実行してバンドルしているだけだからです。

したがって、いくつかの回避策:

  • 秘密の変更セットの祖先として、少なくとも 1 つのドラフトまたは公開の発信変更セットがあることがわかっている場合は、次を使用できます。

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

    欲しいものを手に入れるために。outgoing()リビジョンセットは、欠落しているドラフトと公開の変更セットを選択し、適切parents(outgoing()なベースになります。使用--baseするので、これらのベースからすべての子孫 (パブリック、ドラフト、およびシークレット) を取得します。

  • 秘密の変更セットを一時的に下書きにし、バンドルしてから、再度秘密にすることができます。

    $ secret=$(hg log --template "{rev} " -r "secret()"); \
      hg phase -d $secret; \
      hg bundle out.hg; \
      hg phase -f -s $secret
    

    (私はZshを使用していますが、Zshはデフォルトでパラメーター展開で単語分割を行わないため、${=secret}代わりに使用する必要がありました。)$secret

    呼び出しで何が起こってもフェーズをリセットしたいので、;代わりにコマンドをチェーンすることが重要です。秘密の変更セットには秘密の子孫しかないため、この手法では情報が失われないことにも注意してください。&&hg bundlehg 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

フェーズ情報はバンドルに保存できないことに注意してください — バンドル形式はそれに対応するように変更されていません。

于 2012-03-10T10:45:21.370 に答える
1

少なくとも 1 つの公開変更セットがあることがわかっている場合は、これを使用できます。

hg bundle -r "not public()" --base public()

パブリックチェンジセットがない場合、OTOHは機能しません。代わりにこれを使用してください:

hg bundle -r "not public()" --base null

マーティンの答えの問題は、それが送信に依存していることであり、送信はプッシュリポジトリへの直接接続に依存しています。そのレポへのインターネット接続が常にあるとは限らない場合は、これらの方法がうまく機能します。また、フェイズダンスよりもややシンプルです。

公開チェンジセットがあるかどうかのテストの 1 つは、次の出力をキャプチャすることです。

hg log -r public() -l 1 --template "{rev}"

その長さ、または [0-9] の存在をテストします。

于 2014-11-14T23:08:06.127 に答える