0

次のようなレポがある場合:

A--B--C--D
    \
     E--F--G

リビジョンEを指定するにはどうすればよいですか?-r'ancestors(D、G)'のようなことをしてBを取得することはできますが、Eを指定するための合理的な方法が必要です。

また、より良いワークフローがある場合に備えて、なぜこれを行うのかを説明しましょう。

上の図では、A--B--Cはメインリポジトリにあります。A--B--E--F--Gは私自身のプライベートフォークリポジトリにあり、F(そしてFのみ)をメインリポジトリにマージする必要があります。これを行うには、プライベートリポジトリをメインにプルし、次にFをグラフトして(Dを作成するため)、hgストリップエクステンションを使用してE--F--Gを削除し、メインリポジトリに押し戻します。

現在、これを行うには、GUIツールを開いてブランチの画像を確認し、そのツールからリビジョンEを手動でコピーして貼り付けます。GUIツールを使用して実際にリポジトリを管理するのは好きではないので、そのリビジョンをhgストリップのターミナルに貼り付けるだけです。これは私がまだGUIツールで行う必要がある唯一のことであり、これを行うたびに起動する必要はありません。私が欲しいのは、リビジョンを指定する方法を理解し、そのリビジョンでhgストリップを実行するalaisを作成することです

4

2 に答える 2

2

私はそれmin(descendants(max(ancestor(D,G))) and not ancestors(D))があなたが望むものを手に入れると思います。

DとG(max(ancestor(D,G)))の最新の共通祖先を見つけ、そのすべての子孫を取得してから、Dの祖先を除外します。最後に、を使用min()して、そのセットの最も古いものであるEを取得します。

これmax()は実際には必須ではありませんが、ある時点でメインブランチを自分のブランチにマージできた可能性をカバーしています。これを削除して、クエリを短くすることができます。また、およびのショートカット::として使用することで短縮することもできます。ancestors()descendants()!notmin(ancestor(D,G)::) and !::D)

しかし、私は本当にこのリビジョンセットを渡すだけではありませんhg strip。削除する前に、必要なリビジョンが提供されていることを確認します。

このワークフローにはMercurialQueues拡張機能を使用することを検討します。基本的に、E、F、およびGをパッチキューに保持し、それらすべての適用を解除し、プルしてCに更新し、Fを適用して、EとGを破棄します。これは次のようになります。

> hg qpop all
> hg pull -u
> hg qpush --move F
> hg qdelete E
> hg qdelete G

ここで、F、E、およびGは、を使用して作成したパッチファイルの名前ですhg qnew。それは私にはより良いワークフローのように思え、複雑なrevsetクエリを使用してコミットを削除する必要はありません。

于 2013-03-15T08:42:59.870 に答える
0

私はリモートリポジトリを使用しているので、実際にワークフローのより良い解決策を見つけました。

私はそれを含むものと持っているremote1ものA--B--Cを持っremote2ています、そして私はに接ぎ木しA--B--E--F--Gたいと思います。Fremote1

これが私が思いついたワークフローです。 (根本的な問題を解決するためにremote1使用する)のローカルクローンから始めます。outgoing

$ hg pull remote2
$ hg graft F
$ hg push -r tip
$ hg strip -r 'roots(outgoing())'
于 2013-07-10T20:55:46.520 に答える