すべてのローカルチェンジセットを削除し、ツリーに戻します


95

私はMercurialを使用していて、3つの頭を持つローカルでひどい混乱に陥っています。プッシュすることはできません。ローカルの変更とコミットをすべて削除し、完全にクリーンなコードとクリーンな履歴からやり直したいだけです。

言い換えると、(a)リモートブランチの先端に存在するものとまったく同じコードがローカルにあり、(b)ローカルコミットの履歴がないことです。

hg update -Cローカルの変更を上書きすることを知っています。しかし、ローカルコミットを削除するにはどうすればよいですか?

明確にするために、私がローカルで行った作業を保存することに関心はありません。完全にクリーンなローカルチェックアウトに戻す最も簡単な方法が欲しいだけです。


回答:


129

最も簡単な方法(新しいhg clone)が実用的でない場合は、次のように使用しますhg strip

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

hg outgoing静かになるまで繰り返します。hg strip $rev抹消$revとそのすべての子孫に注意してください。

最初にstripMercurial設定を有効にする必要がある場合があることに注意してください。

PS:さらに賢いアプローチは、revset言語を使用することです。

% hg strip 'roots(outgoing())'

1
ありがとうございました!私はこれが完全に解決し、大騒ぎすることのない状況に終わりました。
eswald 2011年

1
これにより、上記の大きな修正から私を救いました。非常にシンプルです。ありがとうございます。
デビッドC

3
hg strip 'roots(outgoing())'それを認識しないために誰かが仕事に就くのに問題がある場合'roots(outgoing())'。で動作させることができましたhg strip "roots(outgoing())"
jsea

cmd.exeはい、@ SombreErmine
ちょうど誰か

21

リモートリポジトリにも存在するチェンジセットのみを保持するローカルクローンを作成する必要があります。使用TortoiseHgのhg logまたはあなたの改正のどのうちの図のようには、最新のリビジョンは、あなたがいることではなかった(混乱を開始する前に1)を作ります。を使用hg outgoingすると、ここで役立ちます-変更セットがすべて一覧表示されます-これらのどれよりも前のリビジョン番号を選択してください。

ターゲットリビジョンが呼び出さgoodれ、クローンがと呼ばれるfoo場合は、次のようにします。

hg clone -r good foo foo-clean

これは高速なローカル操作になります。すべてを再度ダウンロードする必要はありませんfoo-cleanクローンのみ改正までのチェンジセットが含まれていますgood。デフォルトのプッシュ/プルパスなどのリポジトリローカル設定を保持するためにfoo-clean/.hg/hgrcfoo/.hg/hgrcで置き換えることができます。

あなたがその成立したときにfoo-cleanあなたから必要なすべてを持ってfoo、単に削除fooして名前を変更foo-cleanしますfoo。a hg pullを実行して、リモートリポジトリからクローンに新しい変更セットを取得し、通常どおり続行します。


誰も新しい変更セットをリモートリポジトリにプッシュしていない場合、good上記のように使用するリビジョンを決定するのは非常に簡単hg id defaultです。リモートリポジトリのチップのIDが表示されます。


私は同じ状況にありますが、repoディレクトリに多くのファイルがありますが、hgignoreにあります。hg stripをインストールできず、クローン全体を置き換えずにローカルコミットを削除したい。何か案は?-ああ!ファイルを追加していない場合は、他のクローンを古いディレクトリにコピーできます!?
ピーター

ただし、複数のブランチがある場合は、この方法に注意してください。指定されたリビジョンまで複製すると、指定されたリビジョンのブランチのチェンジセットのみが取得されます。次にhg pull -r、追加の各ブランチの最後の「適切な」リビジョンが必要になる場合があります。
Yitz

9

OK。したがって、すべてのローカルのもの、hg init新しいローカルリポジトリhg pull、最新のヒントを削除してください。hg updateこの後を忘れないでください。


ありがとう。「すべてのローカルのものを削除する」と言うときは、リポジトリ全体を削除するのですか、それとも私の変更だけを削除するのですか?hg initは何をしますか(Googleを持っていますが簡単な説明を表示できません)、フラグを使用する必要がありますか?Mercurialの.hgrc設定などは削除されますか?
Richard

更新:プロジェクトのルートディレクトリにあるものをすべて削除してから「hg init」と入力すると、「abort:repository」と表示されます。もう存在している!'。新しいディレクトリからセットアップして作業する必要がありますか?私はできればむしろしたくない...確かに私がローカルで行ったすべてのものを殺す簡単な方法がなければならない!?
Richard

はい、すべてのリポジトリのものを含むすべてを削除します。新しいクリーンフォルダから開始します。バックアップファイルに保存して、hg init reponameで作成した新しいリポジトリにそれらを復元する設定。initとその他の詳細:hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus:hg init+ hg pull= hg clone違いはつまりhg clone素敵になり.hg/hgrc、あなたのためのファイルを、それがhg clone同じファイルシステム上にクローニングする場合スペースを節約するためにハードリンクを使用します。
Martin Geisler、2010年

リチャード:の出力hg help initはここにあります:selenic.com/mercurial/hg.1.html#initしかし、多分それはあまりにも簡潔ですか?さらにサポートが必要な場合は、メーリングリストにメールを送信してください。参照:mercurial.selenic.com/wiki/MailingLists
Martin Geisler、2010年

5

あなたは使うかもしれません

HGストリップリビジョン

ローカルリポジトリのリビジョンとそのサブツリーを強制終了します。

https://www.mercurial-scm.org/wiki/Strip

ただし、すでにプッシュされているものには使用しないでください。


公開リビジョンで使用できますが、もう一度プルすると再び表示されます。(hgストリップはローカルリポジトリでのみ機能します。)
Mike Rosoft

2

ローカルシステムにあるすべてのものを削除し、リモートリポジトリのクローンを再作成するだけです。


2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | カット-d "" -f 1`

私のためのトリックを行います。

作成者名で作成されたデフォルトのリポジトリにプッシュされないすべてのリビジョンを削除します。

このスタイルを使用して、デフォルトのリポジトリではなく別のリポジトリでチェックすることもできます

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | カット-d "" -f 1`

0

TortoiseHgを使用している場合、(小さな)混乱から抜け出す簡単な方法の1つは、まず最新のリビジョンに更新してから、変更セットを選択して「ローカルとマージ」を開始することです。マージダイアログが表示されたら、小さな「+」アイコンをクリックするだけで、いくつかの追加オプションが表示されます。その1つは、「変更セットをマージターゲット(その他)リビジョンから破棄する」です。これを行うと、変更セットはまだリポジトリ内にあり、プッシュされますが、マージで破棄されるため、効果はありません。多くのヘッドにまたがる多くのチェンジセットがある場合、この方法でリポジトリを汚染したくない場合がありますが、これは簡単な修正であり、破棄するチェンジセットに後で参照する可能性のあるデータが含まれているかどうかを検討する価値があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.