web-dev-qa-db-ja.com

SVNから削除されたファイルを復元する正しい方法は何ですか?

リポジトリからファイルを削除し、元に戻したいと思います。私が理解できる最善の方法は:

  • 削除前のリビジョンへの更新
  • 他の場所にファイルをコピーします
  • 頭に更新
  • ファイルをコピーして戻す
  • それらを追加する
  • コミット

それは悪臭がするだけで、起動するすべての履歴が失われます。これを行うにはより良い方法が必要です。私はすでに The SVN Book を調べましたが、何も見つけられず、SVNタグリストを見ています。

110
BCS

Svn mergeを使用します。

svn merge -c -[rev num that deleted the file] http://<path to repository>

例:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

TortoiseSVNの場合(...)

  • エクスプローラで右クリックし、TortoiseSVN->マージ...に移動します.
  • 「リビジョンの範囲をマージする」が選択されていることを確認し、「次へ」をクリックします
  • [マージするリビジョン範囲]テキストボックスで、ファイルを削除したリビジョンを指定します
  • [逆マージ]チェックボックスをオンにして、[次へ]をクリックします
  • マージをクリック

ただし、これは完全にテストされていません。


OPによる編集:これはTortoiseSVNの私のバージョン(次のボタンのない古い種類)で動作します

  • アイテムが削除されたフォルダに移動します
  • エクスプローラで右クリックし、TortoiseSVN->マージ...に移動します.
  • Fromセクションに、削除を行ったリビジョンを入力します
  • Toセクションに、削除する前のリビジョンを入力します。
  • 「マージ」をクリックします
  • コミット

トリックは、backwardsをマージすることです。私を正しい方向に向けてくれたsean.brightに称賛を!


編集:異なるバージョンを使用しています。私が説明した方法は、TortoiseSVNの私のバージョンで完全に機能しました。

また、リバースマージするコミットに複数の変更があった場合、コミットする前にマージが完了したら、それらの他の変更を元に戻すこともできます。そうしないと、これらの余分な変更も取り消されます。

55
Sean Bright

Sean Brightが提案したsvn mergeの問題は、削除と同じリビジョンで行われた他の変更が再導入されることです。 svnコピーは、削除されたファイルにのみ影響する、よりターゲットを絞った操作です。

Tortoise SVNを使用すると、次のようにsvnコピーを介して、作業コピーディレクトリと後のSVNリビジョンから削除されたファイルを復活させることができます。

  • 以前にファイルが含まれていた作業コピーフォルダーを参照します。
  • エクスプローラーでフォルダーを右クリックし、TortoiseSVN->ログを表示に進みます。
  • ファイルを削除したリビジョンの直前のリビジョン番号を右クリックし、「リポジトリを参照」を選択します。
  • 削除されたファイルを右クリックし、「作業コピーにコピー...」を選択して保存します。

削除されたファイルは、作業コピーフォルダーにあります。それをSVNに再度追加するには、復元されたファイルを右クリックし、SVNコミットを選択します。

注意:この方法では、復元されたファイルの以前の履歴が保持されますが、TortoiseSVNログで以前の履歴を表示するには、[ログメッセージ]ダイアログで[コピー/名前変更で停止]がオフになっていることを確認する必要があります。

166
tekumara

完全を期すために、これはあなたがsvn bookで見つけたもので、あなたが何を探すべきか知っていたでしょう。それはあなたがすでに発見したものです:

変更を元に戻す

削除済みアイテムの復活

同じこと、より新しい(そして詳細な)バージョンの本から:

変更を元に戻す

削除済みアイテムの復活

27
gbarry

Tortoise SVNコピー機能を使用して、コミットされた変更を元に戻します。

  1. 削除されたファイル/フォルダーを含む親フォルダーを右クリックします
  2. 「ログを表示」を選択します
  3. 変更/削除が行われる前のバージョンを選択して右クリックします
  4. 「ブラウズリポジトリ」を選択します
  5. 復元する必要があるファイル/フォルダーを選択し、右クリックします
  6. 「コピー先」を選択すると、ファイル/フォルダーが最新リビジョンにコピーされます

役立つことを願っています

16
Mukul Joshi

私は常にサーバー操作としてsvnコピーを使用するようですので、2つの作業パスで動作するかどうかはわかりません。

削除されたファイルをプロジェクトのローカル作業コピーに復元する例を次に示します。

svn copy https://repos/project/modules/module.js@3502 modules/module.js

プロジェクトディレクトリ内にいる間。これは、ディレクトリ全体を復元する場合にも機能します。

12
NullPoiиteя

Tortoise SVNを使用している場合は、そのリビジョンから作業コピーに変更を元に戻して(効果的に逆マージを実行)、別のコミットを行ってファイルを再追加できるはずです。従うべき手順は次のとおりです。

  1. ファイルを削除した作業コピーのフォルダーを参照します。
  2. リポジトリブラウザに移動します。
  3. ファイルを削除したリビジョンを参照します。
  4. 変更リストで、削除したファイルを見つけます。
  5. ファイルを右クリックして、「このリビジョンからの変更を元に戻す」に進みます。
  6. これにより、作業コピーにファイルが復元され、履歴が保持されます。
  7. ファイルをコミットして、リポジトリに追加します。
5
davogones

カメSVN の場合:

まだ変更をコミットしていない場合は、ファイルまたはディレクトリを削除した親フォルダーで元に戻すことができます。

削除されたファイルをすでにコミットしている場合は、リポジトリブラウザを使用して、ファイルがまだ存在するリビジョンに変更し、コンテキストメニューから[コピー先...]コマンドを使用できます。ターゲットとして作業コピーへのパスを入力すると、削除されたファイルがリポジトリから作業コピーにコピーされます。

4
VonC

リビジョン履歴を失わずにファイルを復元できた最も簡単な方法は、SVN copyを使用することです。上記のマージ例は、同じことを達成するためのより複雑な方法のようです。単にリビジョンを復元したいだけなのに、なぜマージする必要があるのですか?

このインスタンスでは次を使用しますが、非常にうまく機能します。

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

私は常にsvn copyをサーバー操作として使用するようですので、2つの作業パスで動作するかどうかはわかりません。

4
Daniel Honig

復元したいファイルを1つだけチェックアウトできるはずです。 svn co svn://your_repos/path/to/file/you/want/to/restore@revのようなものを試してください。revは、ファイルが存在した最後のリビジョンです。

少し前にこれをやらなければなりませんでしたが、正しく覚えていれば、svn-rオプションを使用しても機能しませんでした。 :rev構文を使用する必要がありました。 (逆に思い出したかもしれませんが...)

0
David Z