SVN から削除されたファイルを復元する正しい方法は何ですか?
-
20-08-2019 - |
質問
リポジトリからファイルを削除したので、元に戻したいと考えています。私が理解できる最善のことは次のとおりです。
- 削除前のリビジョンに更新します
- ファイルを別の場所にコピーする
- 先頭に更新
- ファイルをコピーして戻す
- 追加してください
- 専念
それはただ悪臭を放つだけであり、おまけにすべての履歴が失われます。これを行うには、もっと良い方法があるはずです。私はすでに調べました SVN ブック しかし何も見つからず、現在SVNタグリストを調べています。
解決
svn マージを使用します。
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 -> マージ... に移動します。
- の中に から セクションには削除を行ったリビジョンを入力します
- の中に に セクションには、削除する前のリビジョンを入力します。
- 「結合」をクリックします
- 専念
秘訣は融合することです 後ろ向きに. 。称賛の意 ショーン・ブライト 私を正しい方向に導いてくれて!
編集: 異なるバージョンを使用しています。私が説明した方法は、私のバージョンの TortoiseSVN で完全に機能しました。
また、逆マージしているコミットに複数の変更があった場合、マージが完了したらコミットする前に他の変更を元に戻す必要があることにも注意してください。そうしないと、それらの追加の変更も元に戻されます。
他のヒント
Sean Bright が提案した svn マージを実行する場合の問題は、削除と同じリビジョンで行われた他の変更が再導入されることです。svn コピーは、削除されたファイルのみに影響を与える、よりターゲットを絞った操作です。
Tortoise SVN を使用すると、次のように SVN コピーを介して、作業コピー ディレクトリや以降の SVN リビジョンから削除されたファイルを復活させることができます。
- 以前にファイルが含まれていた作業コピー フォルダーを参照します。
- エクスプローラーでフォルダーを右クリックし、TortoiseSVN -> ログの表示に移動します。
- ファイルを削除したリビジョンの直前のリビジョン番号を右クリックし、「リポジトリの参照」を選択します。
- 削除されたファイルを右クリックし、「作業コピーにコピー...」を選択して保存します。
削除されたファイルは作業コピー フォルダーに保存されます。SVN に再度追加するには、復元されたファイルを右クリックし、[SVN コミット] を選択します。
注意:この方法では、復元されたファイルの以前の履歴が保存されますが、TortoiseSVN ログで以前の履歴を確認するには、[ログ メッセージ] ダイアログで [コピー/名前変更時に停止] がオフになっていることを確認する必要があります。
は、完全を期すため、これはあなたが何を探すべきか知っていた、SVNの本で見ていたものです。それはあなたがすでに発見したものです。
同じこと、本のより最近の(と詳細)バージョンから:
Tortoise SVN コピー機能を使用して、コミットされた変更を元に戻します。
- 削除されたファイル/フォルダーが含まれる親フォルダーを右クリックします
- 「ログを表示」を選択します
- 変更/削除が行われる前にバージョンを選択して右クリックします。
- 「リポジトリの参照」を選択します
- 復元する必要があるファイル/フォルダーを選択し、右クリックします
- 「コピー先」を選択すると、ファイル/フォルダーが先頭リビジョンにコピーされます。
お役に立てば幸いです
私はいつもそれが2つの作業パスで動作するかどうかわからないので、サーバーの動作としてSVNのコピーを使用しているようです。
ここでは、プロジェクトのローカル作業コピーに削除されたファイルを復元する例です。
svn copy https://repos/project/modules/module.js@3502 modules/module.js
プロジェクトディレクトリ内でありながら。これは、ディレクトリ全体を復元するためにも機能します。
Tortoise SVN を使用している場合は、そのリビジョンだけの変更を作業コピーに戻して (事実上逆マージを実行して)、もう一度コミットしてファイルを再追加できるはずです。従うべき手順は次のとおりです。
- ファイルを削除した作業コピー内のフォルダーを参照します。
- リポジトリブラウザに移動します。
- ファイルを削除したリビジョンを参照します。
- 変更リストで、削除したファイルを見つけます。
- ファイルを右クリックし、「このリビジョンからの変更を元に戻す」に進みます。
- これにより、ファイルが作業コピーに復元され、履歴が保持されます。
- ファイルをコミットしてリポジトリに追加し直します。
トータスSVN に付きます:
あなたはまだあなたの変更をコミットしていない場合は、は、あなたがファイルやディレクトリを削除した親フォルダに元に戻す操作を行うことができます。
あなたは既に削除されたファイルをコミットしている場合は、、あなたはファイルがまだ存在していたリビジョンに変更して、リポジトリブラウザを使用することができますし、コンテキストメニューからコマンドのコピーに...を使用します。ターゲットと削除されたファイルは、作業コピーにリポジトリからコピーされますよう。
作業コピーへのパスを入力します。
リビジョン履歴を失わずにファイルを復元できる最も簡単な方法は、 SVNコピー, 、上記のマージ例は、同じことを達成するためのより複雑な方法のように思えます。単にリビジョンを復元したいだけの場合に、なぜマージする必要があるのでしょうか?
この例では次のものを使用していますが、非常にうまく機能します。
svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs
いつも使っているようです svn copy
サーバー操作として動作するため、2 つの作業パスで動作するかどうかはわかりません。
あなたはちょうどあなたが復元したい一つのファイルをチェックアウトすることができるはずです。 svn co svn://your_repos/path/to/file/you/want/to/restore@rev
は、ファイルが存在していた時の最後のリビジョンですrev
のようなものを試してみてください。
私はこの少し前、正確にしなければならなかったと私は記憶が正しければ、-r
にsvn
オプションを使用すると、動作しませんでした。私は:rev
構文を使用する必要がありました。 (私は後方にそれを覚えているかもしれませんが...)