76

SVNリポジトリを台無しにしたので、リポジトリ全体をリビジョン28から24に戻す必要があり、差分や競合に対処したくありません。これを行うための迅速で簡単な方法はありますか?マージコマンドを使用して、問題なく単一のファイルを元に戻すことができましたが、この場合、本当にやりたいのはファイルを削除するだけで、リビジョン28からすべてのファイルをリポジトリに追加したいと考えています。

Linuxボックス(bash)でコマンドラインを使用しています。

ありがとう

編集

すべての助けをありがとう!私はそれを修正しました:

svnadmin create /svnroot/<repo>.fixed
svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
svnadmin load /svnroot/<repo>.fixed < dump.svn

次に、古いリポジトリをバックアップの場所に置き、repo.fixedをリポジトリに移動します。

再度、感謝します!

4

14 に答える 14

26

svnadmin ダンプ/ロードを確認してください。ファイルのすべてのバージョンでテキスト ファイルが作成されます。特定のポイントの上下をすべて削除して、再インポートできる場合があります。

たとえば、「リポジトリ データを他の場所に移行する」を参照してください。

于 2008-12-31T03:23:58.450 に答える
25

「逆」マージが必要な場合があります。svn book の「変更の取り消し」セクションを参照してください。

例: svn merge -r 28:24 [svn へのパス]

于 2008-12-31T03:00:47.297 に答える
14

SVN サーバーにアクセスできる場合は、 を編集path/db/currentして元に戻したい古いリビジョン番号 (ここでは 24) をそこに置き、不要になったリビジョン ファイル (つまり 25、26、27、28) を から削除しますpath/db/revs/0/。リポジトリ内のディレクトリを誤って削除した後、少なくともこれは今日私にとってはうまくいきました。

于 2009-10-26T22:14:39.783 に答える
13

ファイルが存在したという「証拠」を完全に消去する必要がある場合は、上記の svndump/svnload アクションを実行する必要があります。

間違いを犯した「通常の」状況では、逆マージを使用する必要があります。これにより、r24 以降の変更を元に戻すと、元に戻したり、差分を取ったりできるようになります。

以下のコマンドは、変更を元に戻すために機能するはずです (マージをリポジトリに反映するには、マージの結果をコミットする必要があります)。

svn merge -r 28:24
于 2008-12-31T19:41:58.697 に答える
6

管理者権限を利用できない場合、古いリビジョンを消去することはできませんが、驚くほど単純な「svn copy」コマンドを 1 つ使用するだけで、非常にうまく非表示にすることができます (nickf と JesperE は既にこれについて言及しましたが、かなり不可解な方法で)。

svn 削除プロトコル://svnserver/some/resource
svn コピー プロトコル://svnserver/some/resource@24 プロトコル://svnserver/some/resource

以上で、リビジョン 25 から 28 は svn log から完全に消えました。これはまったくハックではなく、安全で (かろうじて...) 文書化された機能です。

「resource」がディレクトリの場合、最後の URL から削除する必要があります。

svn コピー プロトコル://svnserver/some/directory@24 プロトコル://svnserver/some/

(それ以外の場合は、それ自体の中にコピーします)

于 2010-08-30T11:37:43.903 に答える
4

TortoiseSVN を使用している人にとって、解決策は簡単です。

  • 変更ログを表示
  • ロールバックしたいリビジョンを右クリック...
  • ...「このリビジョンに戻す」を選択
  • 変更をコミットします

この方法では、バージョン履歴 (元に戻したすべてのリビジョン) が保持されます。

于 2013-02-20T02:03:02.277 に答える
3

特定のリビジョンの新しいチェックアウトを行うことができます。http://svnbook.red-bean.com/en/1.1/re04.html

svn co path/to/my/repo -r 24
于 2008-12-31T02:41:01.563 に答える
2

アプリケーションのフォルダー構造が変更されていない場合は、古いリビジョンをチェックアウトし、.svnフォルダーを最新のリビジョンからチェックアウトされた古いリビジョンに置き換えます。これで、「古い」バージョンをコミットできます。

于 2008-12-31T04:13:29.927 に答える
1

本当にリポジトリからファイルを完全に削除したい場合は、ファイルにsvndumpを実行し、不要なリビジョンやファイルパスを除外し、新しいリポジトリを作成し、フィルタリングされたダンプを新しいリポジトリにsvnloadする必要があります。リポジトリ。これを行う前に、リポジトリのメンテナンスに関するSVNブックのセクションを注意深く読み、新しいリポジトリに必要なものが含まれていることを確認するまで、既存のリポジトリを削除しないようにしてください。

于 2008-12-31T03:40:36.187 に答える
1

svn del最上位のディレクトリを教えてsvn copyください。

svn copy svnurl@version svnurl 
于 2012-02-02T05:36:14.930 に答える
0

まだライブプロダクションで使用していないため、これが機能するかどうかは完全にはわかりませんが、テストリポジトリを試したところ(プロダクションリポジトリの1つをコピーしました)、機能しているようです。

リポジトリにいるときは、次のコマンドを使用します。

svn update -r 24 trunk

ここで、 24はリビジョン番号であり、trunkは、上記のリビジョン番号に更新(またはこの場合は復元)するファイル/フォルダーです。

私のテストでは、いくつかのファイルが更新され、(再)追加されました。コミットを実行した後、警告はまったく表示されませんでした。次に、ダミーテキストを使用してファイルを変更し、さらに別のコミットを試みましたが、変更されたリストに表示されたのはそのファイルだけでした。だからそれはかなりうまくいくようです!

繰り返しになりますが、これまでライブプロダクションで使用したことはありませんでした。間違っている場合はアドバイスしてください。私はこれが進むべき道であるかどうかも知りたいです。なぜなら、私は(近い)将来これを必要としているのを見ることができるからです。

-デイブ

于 2008-12-31T04:02:27.797 に答える
0
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"
于 2010-10-21T13:52:02.763 に答える
0

私はこれを言いたくないのですが、それは自分の svn リポジトリのバックアップを使用していることに気付いた状況です。

特定のリビジョンのファイルをリポジトリ内の新しいディレクトリにコピーできますか?

于 2008-12-31T03:09:54.830 に答える
0

これが私がそれをやり始める方法です。残忍ですが、衝突を完全に無視し、リビジョン履歴をそのまま保持することが保証されているのはそれだけです

  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の「通常の」方法ではないことに注意してください。通常の方法は、古いバージョンからブランチを作成し、そのブランチをヘッドにマージすることです。(少なくとも、以前はそうでし)

編集:上記のコードはテストされていません。そのまま実行しないでください。

于 2008-12-31T03:26:16.590 に答える