Mercurialを使用して、どうすれば“圧縮”プッシュする前に、一連の変更セットを1つに変更しますか?
-
05-07-2019 - |
質問
ローカルとリモートのMercurialリポジトリがあるとします。今、私は機能の作業を開始します。私はそれに取り組み、完了したと思うと、チェンジセットをコミットします。もう少しテストしてみると、コード内で何かを微調整することでこの機能をさらに改善できることがわかりました。変更してコミットします。 20分後、この新しい機能にバグがあることがわかったので、修正してコミットします。
たとえば、「Implementing feature X」というメッセージを持つ1つのチェンジセットとしてリモートリポジトリにプッシュしたい3つのチェンジセットがあります。
手間をかけずにこれを行うにはどうすればよいですか?私はパッチでそれを行うことができると信じていますが、それは多くの作業のようです。
解決
拡張機能の折りたたみはどうですか?
他のヒント
histedit 拡張機能はまさにあなたが探しているものです。
hg histedit -o
または
hg histedit --outgoing
発信するチェンジセットのリストが表示されます。リストから次のことができます
- 2つ以上の変更セットを1つの変更セットとして作成します
- 変更セットをドロップして履歴から削除する
- 変更セットを好きなように並べ替えます。
histeditは、デフォルトで" \ n *** \ n"の2つのメッセージを含む、折りたたまれたチェンジセットの新しいコミットメッセージを要求します。それらを分離します。
mq拡張を使用しても同様の結果を得ることができますが、それははるかに困難です。
折りたたみ拡張機能を使用して折りたたみを行うこともできますが、UIとしては優れておらず、結果のコミットメッセージを編集する方法も提供しません。結果のコミットメッセージを編集すると、最終メッセージをクリーンアップすることもできます。これは私がいつも利用しているものです。
はい、パッチでそれを行うことができます: あなたの作業がチェンジセット100から110に含まれていると仮定しましょう。
-
パッチの作成:
%hg export -o mypatch 100:110 --git
-
99への更新:
%hg update 99
-
-no-commitを使用してパッチを適用します(そうしないと、すべての変更セットが返されます):
%hg import --no-commit mypatch
-
すべての変更を一度にコミットする:
%hg commit
-
現在、2つのヘッド(110と111)があり、作業ディレクトリで生成されるファイルの点で同等である必要があります。
%hg strip 100
OK、今ではすべてを綴ったので、長いように見えますが、自分で何回もやったので、あまり面倒なことはありません...
TortoiseHgを使用している場合、使用できるのは2つのリビジョンを選択し(CTRLを使用して後続のリビジョンを選択しない)、右クリックして"履歴を圧縮" を選択します。
その後、前に選択した最初の変更から始まる新しい変更リストが新しいヘッドに表示され、選択したものの間のすべての子孫変更リストが含まれます。
古い変更リストが不要になった場合は、単純に削除できます。 MQ 拡張機能を使用します。繰り返しになりますが、TortoiseHgで、すべての子孫とともに削除する必要がある最初の変更リストを右クリックし、"履歴の変更->ストリップ" 。
この折りたたみに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を使用すると、非常に便利な他のすべてのことができます。
hg collapse
と hg histedit
が最良の方法です。または、信頼できる方法で動作するのであれば、それが最良の方法でしょう... 3分以内にスタックダンプでクラッシュする histedit
を取得しました。 崩壊
はそれほど良くありません。
他の2つのBKMを共有するかもしれないと思った:
-
hg rebase --collapse
この拡張機能はMercurialとともに配布されます。まだ問題はありません。
hg rebase
の制限を回避するには、いくつかのゲームをプレイする必要があります。 (名前付き)ブランチ。 -
リポジトリ(
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
ツリーが作業ディレクトリとそのファイルから独立している限り機能します。
独立していない場合...
Mercurialを使用したことはありませんが、これはMartin Fowlerが彼のブログであまりにも前に話していたこととよく似ています:
hg strip --keep
コマンドだけではない理由
その後、すべての変更を1つのコミットとしてコミットできます。
HistEditはあなたが望むことをしますが、おそらくやり過ぎです。必要なのがいくつかの変更セットをまとめて折り畳むことだけである場合、 Collapse Extension が作業を行います。
Mercurialで未公開の THIS
と THAT
の2つのコミットがあり、それらが 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
注名前 THATNAME
を見つけるには、次を使用します。:
$ hg qseries
すべてのパッチを適用し、リポジトリ履歴に移動します::
$ hg qpush -a
$ hg qfinish -a
テーマに関する私のブログ投稿は Mercurialで2つのコミットに参加する。
はい、 strip --keep
は著者の質問に対して機能します。ただし、たとえば、バージョンが1〜30で、バージョン12〜15のみを縮小したい場合など、他とは若干異なります。他のソリューションは機能しますが、 strip --keep
は機能しません。