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


119

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

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

それは悪臭がするだけで、起動するすべての履歴が失われます。これを行うためのより良い方法がなければなりません。私はすでにSVNブックを調べましたが、何も見つからず、SVNタグリストを調べています。


4
確かにtukushanの答えはあなたの質問に対する正しい直接的な応答であり、受け入れられるべきですか?
James McCormack

@JamesMcCormack:彼の答えでNBを参照してください。
BCS

2
ヒント:ファイルを削除し、まだ変更をコミットしていない場合は、クリックして更新するだけでファイルが復元されます。
Hammad Khan 2013

回答:


57

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-> Merge ...に移動します。
  • 「リビジョンの範囲をマージする」が選択されていることを確認し、「次へ」をクリックします
  • 「マージするリビジョン範囲」テキストボックスで、ファイルを削除したリビジョンを指定します
  • [リバースマージ]チェックボックスをオンにして、[次へ]をクリックします
  • マージをクリックします

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


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

  • ものがdelateされたフォルダに移動します
  • エクスプローラーで右クリックし、TortoiseSVN-> Merge ...に移動します。
  • から、セクションの削除をしたリビジョンを入力してください
  • セクションで、削除前のリビジョンを入力します。
  • 「マージ」をクリックします
  • コミット

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


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

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


私はWindowsを使用していて、SVNのCLIバージョンを持っていません。ortoiseSVNでそれを行う方法を知っていますか?
BCS、

亀は、右クリックメニューに「マージ」があります。回転のために記入するボックスがあります。また、「Dry Run」を使用して、正しく設定されているかどうかを確認します。また、結果はコミットするまでカウントされません。すべてうまくいかない場合は元に戻すことができます。
gbarry 2009年

OPには古いバージョンのTortoiseがあると思います。新しいものには異なる(劣った)マージダイアログがあります
1800情報

うまくいかなかったマージシステムはまだ見ていません。テキスト、ファイル、ディレクトリ、Word文書、うん。それは解決可能な問題ではないと思います。OTOHのものは多かれ少なかれ吸うことができます。:)
BCS

1
複数のファイルを元に戻してから、いずれかの元に戻すと、元に戻せません。痛い!私は何かを傷つけるだけのものです。
BCS

176

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

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

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

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

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


26
削除されたファイルまたはフォルダが非常に大きかった場合、これはまた、サーバー上で直接便利に実行することができます: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
クレイグ

これが正しい方法です。TortoiseSVN 1.8.1で試したところ、アドバイスどおりに動作しました。
Gianluigi Zane Zanettini博士2013

パーフェクト!! シンプルで効果的。解決策をありがとう
ハンター

この方法により、親ブランチから削除された子ブランチにファイルを復元するのがはるかに簡単になりました。たぶんでそれを行う方法があったかもしれmergeませんが、私はそれを理解しませんでした。
arr_sea 2014年

手順3の「直前」が重要です。手順4では、Windowsの削除を使用してファイルを削除したにもかかわらず、Tortoiseはファイルがすでに存在していると不平を言い続けました。最初に作業コピーを更新する必要がありました。(私の同僚はTortoise削除を使用していくつかのファイルを削除してから、変更をコミットしました。)TortoiseSVN 1.8.1。
leqid 14

27

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

変更を元に戻す

削除済みアイテムの復活

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

変更を元に戻す

削除済みアイテムの復活


3
ほとんどの問題のほとんどが何を探すべきかを知っていることを示すために行きます。
BCS、

16

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

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

それが役に立てば幸い


13

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

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

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

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


2
+1コピーが機能しました。Mac OSXでCollabNet svn 1.6.17を使用する場合、copy -rは機能しないようです。
グレー

2
また、使用するリビジョンは削除直前のリビジョンでなければなりません。
グレー

6

Tortoise SVNを使用している場合は、変更をそのリビジョンから作業コピーに戻すことができ(事実上、リバースマージを実行します)、もう一度コミットしてファイルを再度追加します。従うべき手順は次のとおりです。

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

その場合は問題ありません。問題は、あなたが今説明したことをどのように行うかでした。(回答:マージを逆方向に使用)
BCS

1
Tortoise SVNでそれを行う方法について話していました。詳細を追加します。
davogones 2009年

5

ファイルを復元し、変更履歴を失わない最も簡単な方法は、SVNコピーを使用することです。上記のマージの例は、同じことを実現するためのより複雑な方法のように見えます。単にリビジョンを復元したいのに、なぜマージする必要があるのですか?

この例では以下を使用していますが、非常にうまく機能します。

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

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


3
SVN COPYが推奨されるアプローチです。構文は非常に簡単です。svncopy [SVN URL] @ [REVISION#WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO] from visualsvn.com/support/svnbook/branchmerge/basicmerging。自分で使っただけです。
アミット

これは私にとって最も理にかなっています。私もこのアプローチを使用しています
Dmitry Pashkevich '17

4

トータスSVN

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

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


いいね。次回もやってみます。
BCS

1

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

私は少し前にこれを正確に行わなければなりませんでしたが、正しく覚えていれば、-rオプションを使用svnしても機能しませんでした。:rev構文を使わなければなりませんでした。(逆に覚えていたかもしれませんが...)


それは私が望むものではありません。ファイルをリポにパッチして、SVNに同じファイルであることを知らせたい。
BCS、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.