web-dev-qa-db-ja.com

Mercurialを使用して、プッシュする前に一連の変更セットを「圧縮」するにはどうすればよいですか?

ローカルとリモートのMercurialリポジトリがあるとします。今、私は機能の作業を開始します。私はそれに取り組み、完了したと思うと、チェンジセットをコミットします。もう少しテストしてみると、コード内で何かを微調整することでこの機能をさらに改善できることがわかりました。変更してコミットします。 20分後、この新機能にバグがあることがわかったので、修正してコミットします。

これで、たとえば、「Implementing feature X」というメッセージを持つ1つのチェンジセットとしてリモートリポジトリにプッシュしたい3つのチェンジセットができました。

手間をかけずにこれを行うにはどうすればよいですか?私はパッチでそれを行うことができると信じていますが、それは多くの仕事のようです。

95
Lucas

Collapse Extension はどうですか?

38
Steve Losh

histedit拡張機能はまさにあなたが探しているものです。

hg histedit -o

または

hg histedit --outgoing

発信チェンジセットのリストが表示されます。リストから次のことができます

  • 1つだけの変更セットを作成して2つ以上の変更セットを折りたたみます
  • 履歴からそれらを削除する変更セットをドロップします
  • 好きなように変更セットを並べ替えます。

histeditは、折りたたまれたチェンジセットの新しいコミットメッセージを要求します。デフォルトでは、2つのメッセージに「\ n ***\n」で区切られています。

Mq拡張を使用しても同様の結果を得ることができますが、それははるかに困難です。

また、折りたたみ拡張機能を使用して折りたたみを行うこともできますが、NiceとしてUIを提供せず、結果のコミットメッセージを編集する方法を提供しません。結果のコミットメッセージを編集すると、最終メッセージをクリーンアップすることもできます。これは、私がいつも利用しているものです。

51
Stefan Rusek

はい、あなたはパッチでそれを行うことができます:あなたの仕事がチェンジセット100から110に含まれていると仮定しましょう

  1. パッチを作成します。

    % hg export -o mypatch 100:110 --git

  2. 99への更新:

    % hg update 99

  3. --no-commitを使用してパッチを適用します(そうしないと、すべての変更セットが元に戻ります)。

    % hg import --no-commit mypatch

  4. すべての変更を一度にコミットします。

    % hg commit

  5. これで、2つのヘッド(110と111)が作成され、作業ディレクトリで生成されるファイルの点で同等になります。おそらく、古いヘッドを削除する前に、健全性のためにそれらを比較してください。

    % hg strip 100

さて、私はすべてを綴ったので、長いように見えますが、自分で何回もやったので、私はそれが面倒すぎるとは思いません...

20
Arkady

TortoiseHgを使用している場合は、2つのリビジョンを選択するだけで(後続のリビジョンを選択するにはCTRLを使用)、右クリックして"履歴の圧縮"を選択できます。

その後、前に選択した最初の変更から始まる新しい変更リストが新しいヘッドに表示され、選択したものの間のすべての子孫変更リストが含まれます。

不要になった古い変更リストは単純に削除できます。[〜#〜] mq [〜#〜]拡張を使用します。繰り返しになりますが、TortoiseHgで、最初の変更リストを右クリックして、そのすべての子孫と一緒に削除する必要があります"変更履歴->削除"

19
Rageous

この折り畳みにmqを使用する私の好ましい方法は、TortoiseHg ここで説明するように を使用することです。ただし、次のようにコマンドラインから簡単に実行できます。

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(qfoldステップを実行するより良い方法があるかもしれませんが、私は通常、その操作にTortoiseHgを使用するため、それを認識していません。)

最初は少し複雑に見えますが、mqの使用を開始すると、非常に簡単で自然なものになります。さらに、mqを使用すると、非常に便利な他のすべてのことができます。

18
Chris Phillips

hg collapseおよびhg histeditが最善の方法です。または、むしろ、それらが確実に機能するなら、最良の方法でしょう... 3分以内にスタックダンプでクラッシュするhisteditを得ました。 Collapseはそれほど良くありません。

私は2つの他のBKMを共有するかもしれないと思った:

  1. hg rebase --collapse

    この拡張機能はMercurialとともに配布されます。まだ問題はありません。 hg rebase制限-基本的に、名前付きまたはデフォルトの同じブランチの祖先にリベースすることは好きではありませんが、(名前付き)ブランチ間でリベースする場合は許可します。

  2. リポジトリを移動します(foo/.hg)作業ディレクトリ(bar)およびそのファイル。その逆ではありません。

一部の人々は、2つのクローンツリーを作成し、それらの間でファイルをコピーすることについて話しました。またはそれらの間のパッチ。代わりに、.hgディレクトリ。

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg Push

これは、真のリポジトリである.hgツリーは、作業ディレクトリとそのファイルから独立しています。

独立していない場合...

4
Krazy Glew

私はMercurialを使ったことがありませんが、これはMartin Fowlerが彼のブログであまりにも前に話していたこととよく似ています。

http://martinfowler.com/bliki/MercurialSquashCommit.html

2
Joseph

Mercurialに2つの未公開のTHISコミットとTHATコミットがあり、THISポイントで単一のコミットに参加するようにするとします。

... --> THIS --> ... --> THAT --> ... --> LAST

コミットが公開されていないことを確認します::

$ hg glog -r "draft() & ($THIS | $THAT)"

LAST commitへの更新::

$ hg up

THISまでのコミットをMQにインポートします。

$ hg qimport $THIS::.

すべてのパッチを適用解除し、最初のTHIS ::のみを適用します

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

THAT ::と結合します

$ hg qfold $THATNAME

[〜#〜] note [〜#〜]名前THATNAMEを見つけるには:

$ hg qseries

すべてのパッチを適用し、リポジトリ履歴に移動します::

$ hg qpush -a
$ hg qfinish -a

件名に関する私のブログ投稿は Mercurialで2つのコミットに参加する です。

0
gavenkoa

HistEditはあなたが望むことをしますが、おそらくやり過ぎです。必要なのが、いくつかの変更セットを一緒に折り畳むことだけである場合、 Collapse Extension がジョブを実行します。

0
Steve Losh

はい、 strip --keepは作者の質問に対して機能します。ただし、たとえば、バージョンが1〜30で、バージョン12〜15のみを折りたたみたい場合など、他とは少し異なります。他のソリューションは機能しますが、機能しませんstrip --keep

0
Frank Tao

なぜhg strip --keepコマンド?

その後、すべての変更を1つのコミットとしてコミットできます。

0
G. Demecki