SVNリポジトリを台無しにしたため、リポジトリ全体をリビジョン28から24に戻す必要があり、差分や競合に対処したくありません。これをすばやく簡単に行う方法はありますか?私はマージコマンドで元に戻す前に単一のファイルを元に戻すことができました-しかしこの例では、本当にやりたいのはそれらを削除するだけでリビジョン28からリポジトリにすべてのファイルを追加したいです。
Linuxボックス(bash)でコマンドラインを使用しています。
ありがとう
[〜#〜] edit [〜#〜]
助けてくれてありがとう!私はそれを修正しました:
svnadmin create /svnroot/<repo>.fixed
svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
svnadmin load /svnroot/<repo>.fixed < dump.svn
次に、古いリポジトリをバックアップの場所に置き、repo.fixedをリポジトリに移動します。
再度、感謝します!
Svnadminダンプ/ロードを確認してください。ファイルのすべてのバージョンでテキストファイルを作成します。特定のポイントの上/下のすべてを削除し、それを再インポートすることができます。
インスタンスを参照してください 他の場所でのリポジトリデータの移行
「逆」マージが必要な場合があります。 "undoing changes" svn bookのセクションを参照してください。
例えば。 svn merge -r 28:24 [svnへのパス]
SVNサーバーにアクセスできる場合は、path/db/current
を編集し、元に戻す古いリビジョン番号(ここでは24)をそこに配置し、不要なリビジョンファイル(25、26、27など)を削除できます。 、28)path/db/revs/0/
から。少なくとも今日は、リポジトリ内のディレクトリを誤って削除してしまったため、これでうまくいきました。
ファイルが存在したことの「証拠」を本当に消去する必要がある場合は、上記のsvndump/svnloadアクションを実行する必要があります。
間違えた「通常の」状況では、逆マージを使用する必要があります。これにより、r24の後の変更を元に戻すことも、元に戻す、差分を付けるなどできるようになります。
以下のコマンドは、変更を元に戻すために機能するはずです(マージの結果をコミットして、リポジトリ内のマージを反映する必要があります)
svn merge -r 28:24
管理者権限を使用しない場合、古いリビジョンを完全に消去することはできませんが、驚くほどシンプルな「svn copy」コマンドを1つ使用するだけで、それらを非常にうまく隠すことができます
svn delete protocol:// svnserver/some/resource
svn copy protocol:// svnserver/some/resource @ 24 protocol:// svnserver/some/resource
それだけです、リビジョン25から28はsvnログから完全に消えました。それはまったくハックではなく、安全で(ほとんど...)文書化された機能です。
「リソース」がディレクトリの場合、最後のURLから削除する必要があります。
svn copy protocol:// svnserver/some/directory @ 24 protocol:// svnserver/some /
(それ以外の場合は、内部にコピーします)
TortoiseSVNを使用している場合、ソリューションは簡単です。
この方法では、バージョン履歴(つまり、元に戻したすべてのリビジョン)が保持されます。
特定のリビジョンの新しいチェックアウトを実行できます。 http://svnbook.red-bean.com/en/1.1/re04.html
svn co path/to/my/repo -r 24
アプリケーションのフォルダー構造が変更されていない場合は、古いリビジョンをチェックアウトし、最新のリビジョンの.svnフォルダーをチェックアウトした古いリビジョンに置き換えます。これで、「古い」バージョンをコミットできます。
リポジトリからファイルを完全に完全に削除する場合は、svndumpをファイルに実行し、不要なリビジョンやファイルパスをフィルターで除外し、新しいリポジトリを作成して、フィルターされたダンプを新しいファイルにsvnloadする必要がありますリポジトリ。 リポジトリメンテナンスに関するSVNブックセクション をよく読んでから、これを行う前に、新しいリポジトリにデータがあることを確認するまで、既存のリポジトリを削除しないようにしてください。あなたが欲しい。
出来ますか svn del
最上位ディレクトリ、次にsvn copy
それら:
svn copy svnurl@version svnurl
私はこれを言うのは嫌いですが、それは私が自分のsvnリポジトリのバックアップを使用していることに気付いた状況です。
特定のリビジョンのファイルをリポジトリ内の新しいディレクトリにコピーできますか?
これが私がそれを始める方法です。残忍な、はい、しかしそれは衝突を完全に無視することが保証されている唯一のことですおよびリビジョン履歴をそのまま保持します。
cd /scratchdir
svn co -r good svn://repository
cd /hosed_project
svn up -r HEAD
cat >> /tmp/cp.sh
ORIG=$1
TARG=$( echo $ORIG | sed 's/\/scratchdir\///' );
cp $ORIG /hosed_project/$TARG;
^D
chmod u+x /tmp/cp.sh
find /scratchdir -not -wholename "*/.svn*" -exec /tmp/cp.sh {} \;
これはIMOの「通常の」方法ではないことに注意してください。通常の方法は、古いバージョンからブランチを作成し、そのブランチをヘッドにマージすることです。 (少なくとも、それは使用済み動作する方法です)
編集: 上記のコードはテストされていません。逐語的に実行しないでください
私はまだライブプロダクションで使用していないのでこの作品が機能するかどうかは完全にはわかりませんが、テストリポジトリ(プロダクションリポジトリの1つをコピーしました)で試してみました動作するように見えます。
リポジトリにいるときは、次のコマンドを使用します。
svn update -r 24 trunk
ここで、24はリビジョン番号であり、trunkは、そのリビジョン番号に更新(またはこの場合は復元)するファイル/フォルダーです。
私のテストでは、いくつかのファイルが更新および(再)追加され、コミットを行った後、警告はまったく表示されませんでした。次に、ダミーテキストを使用してファイルを変更し、さらに別のコミットを試みましたが、変更されたリストにファイルが表示されたとだけ言いました。だから、かなりうまくいくようです!
繰り返しますが、私はライブプロダクションでこれを使用していませんでしたので、間違っている場合はアドバイスをお願いします。私はこれが(近い)将来にこれを必要としているのを見ることができるので、これも行く方法であるかどうかを知りたいです。
-デイブ
Example:
Rev 100 all is working great
Rev 101 somebody really corrupted the dir structure and / or merged in bad changes, etc.
Rev 102 You delete /trunk
Rev 103 You copy /trunk@100 to HEAD
You now have a /trunk that reflects only Rev 100 and 103. Not 101 or 102.
svn del svn://[RepoName]/trunk -m "removing issue in HEAD"
svn copy svn://[RepoName]/trunk@100 svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"