web-dev-qa-db-ja.com

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

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

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

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

追伸そんなこと知ってる hg forgetまたはhg remove -Afはディレクトリから削除せずに削除しますが、私の質問は、アクションを考え抜くのではなく、私が犯したエラーに関係しています。

96
PurplePilot

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

148
BungleFeet

コメントからの引用:

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

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

$ hg update -C -r-2

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

$ hg log -v
8
mrucci

まあこれは私のために働いた。

hg revert -r revision pathToTheFile
5
Shweta

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 specification について確認してください。

4
PhoneixS

受け入れられた答えへの追加-これは、コミットですべての削除を元に戻したい場合により高速です。数百のファイルが含まれる大きなフォルダーを削除し、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で分割されているテンプレートはないようです。

1
keflavich

以下の方法は簡単で、非常に馬鹿げているので間違ってはいけません。複数のファイルを削除または名前変更した場合は、問題ありません。

hg clone mydirectory mydirectory1

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

完了したら、mydirectory1を削除します。

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

0
ataylor

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

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

0
daniel kullmann

次は私のために働いた。

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

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

hg revert -r <Revision Number> --all
0
Naveen Kumar V