Mercurialで削除されたファイルを回復するにはどうすればよいですか?


100

誤って、CLIではなくGUIを使用して、Mercurialプロジェクトのすべてのファイルを削除しました。

Revert okで回復し、いくつかの作業を失いました。タイムマシンがあるので、簡単に元に戻すことができました。しかし、そのようなファイルを削除/削除解除する方法はありますか?マニュアルやグーグルでトロールされたが、何も見えない。プラグインはありますか?

私はおそらくここで自分の質問に答えていますが、ファイルはディレクトリから削除され、ゴミ箱に復元されなかったため、削除は取り消すことができないと思いますか?

PS私は知っているhg forgethg remove -Af、ディレクトリから削除せずに削除しますが、私の質問は、アクションをクールに考えるのではなく、私が作ったエラーに関係しています。


1
古いリビジョンをチェックアウトして問題なく動作するはずです(もちろん、これは履歴を書き換えなかった場合にのみ機能します)
tback

問題は、私がコミットし、編集し、R(emoved)したことでした。だから、そのシーケンスの後にはい、私は以前のコミットを取得していたので、それに戻って、タイムマシンの形式でバックアップを持っているので、最後の変更を取得して追加し、コミットすることができました。しかし、もし私がbackuopを持っていなかったら、変更は失われていたでしょう。
PurplePilot

1
あなただけのファイル名(速い)検索できます関連質問:stackoverflow.com/questions/1013550/...
マイケル・プライアー

回答:


152

まず、を使用hg grepして、復元する削除済みファイルを見つけます。このコマンドの出力には、ファイルが存在していた最後のリビジョンと、削除されたファイルへのパスが表示されます。次に、hg revert -r <revision number> <path to deleted file> 削除されたファイルが作業コピーに含まれるようになり、ヘッドにコミットする準備が整います。


5
ありがとうございます。「わざと削除したファイルを元に戻すにはどうすればよいですか」に対する答えを探していました。
nc。

日食からこれを行うには、ファイルを右クリックして[チームを選択]-> [元に戻す]
Emil

3
ファイルを含むリビジョンを見つけるもう1つの方法は、hg log -I '**file.ext'
mpen

2
ちょうどFYI:あなたはまだファイル、持っていることをコミットのリビジョン番号たくありません、それを取り外したものを!
Lukas Knuth

8

コメントからの引用:

リポジトリをセットアップし、すべてコミットし、削除してから再度コミットしました

この場合は、作業ディレクトリを以前のリビジョンに更新するだけです。

$ hg update -C -r-2

負のリビジョン番号に注意してください。削除したファイルが以前のリビジョンにない場合は、次のコマンドを使用して見つけることができます。

$ hg log -v


4

Mercurial 1.6以降の場合

削除ファイルの名前がわかっている場合は、次のコマンドでそのリビジョンを簡単に見つけることができます。

hg log -r "removes('NAME.c')"

これにより、(ルートにある)NAME.cというファイルが削除されたウィッチのリビジョンが得られます。

次に、(他の回答と同様に)ファイルを以前のリビジョンに戻すことができます。

hg revert -r <revision number> <path to deleted file>

代わりにファイル名パターンを使用して、知っていることに適応できます。たとえば**/NAME.c、すべてのディレクトリを検索するために使用できます。それについてはFile Name Pattersで読むことができます。そして、このリンクを使用して、新しいrevset仕様について知ってください。


1

受け入れられた回答への追加-コミットですべての削除を元に戻したい場合、これはより高速です。数百のファイルが含まれている大きなフォルダを削除して削除しましたがhg addremove、これはまったく意図していないため、それらの削除をすべて元に戻す必要がありました。

使用してすぐに、Mercurialのリポジトリの歴史の中で、検索削除されたファイルを?+ xargs + tr、リビジョン-3のすべての削除をリビジョン-4のバージョンに戻します。

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

名前にスペースが含まれているファイルがある場合、これは失敗することに注意してください。http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.htmlには、現時点で{file_dels}分割さ\nれているテンプレートがないようです。


0

を使用して、リポジトリの最後のコミットを取り消すことができhg rollbackます。使用できるロールバックのレベルは1つしかないため、複数のコミットで削除を行った場合、変更が完全に取り消されることはありません。これはローカルリポジトリでのみ機能するため、プッシュした場合、リモートリポジトリで元に戻すことはできません。


1
いいえ、これは機能しません。Mercurial Distributed SCM(バージョン1.4.1 + 20091201)を搭載したMacを使用しています。リポジトリをセットアップし、すべてコミットし、削除してから再度コミットしましたが、これはR(emoved)とマークされたファイルのリストを返すだけですが、実際にはファイルを戻しません。コミットする前にファイルをR(emoved)およびRollbackとしてマークすると、何も起こりません。
PurplePilot

hgのロールバックが完了すると、リポジトリはロールバックされますが、現在の作業ディレクトリには変更が残っています。hg up -Cを実行して、ロールバックされたリビジョンをクリーンに更新するようhgに指示します。
テイラー

1
hg rollbackファイルの削除はコミットトランザクションの一部ではないため、削除されたファイルは復元されません。
mrucci

4
そのとおり。削除前にコミットされなかった編集を取得しようとしている場合、それらは失われます。
テイラー

0

hg stripmq(Mercurial Queues)拡張によって提供されるコマンドを使用して、コミットされたリビジョンを削除できます。これにより、ファイルが返されます。

Mercurialの変更セットのデータベースが変更されるため、実際に試す前にバックアップを作成してください。


0

以下の方法は単純明快なので、間違えないように愚かです。複数のファイルを削除または名前を変更した場合は、問題ありません。

hg clone mydirectory mydirectory1

そして、mc(またはFar Manager)を起動して、それが何であったかと何が変わったかを比較します。

完了したら、削除してくださいmydirectory1


0

以下は私のために働いた。

hg revert -r <Revision Number> <File Name>

(オプション、すべてのファイルを元に戻す)

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