1

Windows VM ボックスで VisualSVN を実行しています。VM がクラッシュし、イメージが破損しました。古いイメージ (2007 年) を復元した後、データのバックアップが正しく機能していないことがわかりました。したがって、ラップトップ(クライアント側)に多数のプロジェクト(〜20)があり、それらをVisualSVNサーバーにプッシュして戻したいと考えています。これは現在空です。

プロジェクト ファイルを手動で追加するだけでこれを実行できることはわかっていますが、すべてのファイル (つまり、コンパイル済みファイル) を含めたくないので、これには時間がかかります。どんな提案でも大歓迎です。

4

1 に答える 1

1

残念ながら、完全に自動化されたソリューションはありませんが、リポジトリでバージョン管理されているファイルを把握する 1 つの方法は、コマンドライン ツールでlistコマンドを使用することです。

svn.exe list -R

そのコマンドは、現在のディレクトリで SVN によってバージョン管理されているすべてのファイルを再帰的に一覧表示します。そのリストを取得したら、それらを別のディレクトリにコピーして、新しいリポジトリにバッチコミットできます。

そのコマンドをいくつかのPowershellマジックと組み合わせると、リポジトリを再作成するタスクが可能な限り簡単になります。

アップデート:

私は Powershell でしばらく遊んで、これを行う方法を考え出しました。この例では、元のリポジトリ ディレクトリが C:\source_repos\ で、新しいリポジトリ ディレクトリが C:\dest_repos\ であることを説明します。

  1. コマンド プロンプトを開きます。これは、アクセサリのスタート メニュー フォルダから実行するか、Vista/Win7 の検索ボックスから「cmd」を実行するか、WinXP の [ファイル名を指定して実行...] を実行して実行できます。
  2. コマンド プロンプトから次のコマンドを実行します。

    cd C:\source_repos\
    echo File > filelist.csv
    svn.exe list -R >> filelist.csv
    

    2 番目のコマンドは、最初の行に「File」という単語を含む filelist.csv を作成します。3 番目のコマンドは svn list コマンドを実行し、出力をリダイレクトして filelist.csv に追加します。この時点で、filelist.csv の最初の行に "File" があり、その後に個々の行にリストされている svn ディレクトリ内のバージョン管理されたすべてのファイルが続きます。

  3. 以下のコードを取得して、reposcopy.ps1 という名前のファイルに貼り付けます。

    # Assumptions / Notes:
    #  - No crazy file names with "\" in them!
    #  - A file named filelist.csv was created by running:
    #       svn.exe list -R >> filelist.csv
    #    and is in the base directory of the source repository.
    #  - The first line of filelist.csv is "File" without quotes, this is
    #    important for the Import-Csv command
    #  - If you get an error about permissions when you try to run the script,
    #    use the command "Set-ExecutionPolicy RemoteSigned" in the powershell
    
    # Source & destination repository directories
    $src = "C:\source_repos\"
    $dest = "C:\dest_repos\"
    
    # Get current directory
    $origdir = Get-Location
    
    # Goto source repository directory
    Set-Location $src
    
    # Check if destination repository directory exists, if not create it
    if (![IO.Directory]::Exists($dest)) {
        [IO.Directory]::CreateDirectory($dest)
    }
    
    # Import filelist.csv created with these commands at a command prompt:
    #    cd C:\source_repos
    #    echo File > filelist.csv
    #    svn.exe list -R >> filelist.csv
    $filelist = Import-Csv filelist.csv
    
    # Go through each line in the filelist
    foreach ($line in $filelist) {
        # Concatenate the filename with the source and destination directories
        $srcfile = [String]::Concat($src, $line.File)
        $destfile = [String]::Concat($dest, $line.File)
    
        # If the destination file is a directory and it doesn't exist create it
        # Otherwise copy the source file to the destination.
        if ($destfile.EndsWith("\")) {
            if (![IO.Directory]::Exists($destfile)) {
                [IO.Directory]::CreateDirectory($destfile)
            }    
        } else {
            Copy-Item $srcfile $destfile
        }
    }
    
    # Go back to the original directory
    Set-Location $origdir
    

    実行ごと に$srcおよび変数を変更する必要があります。$dest

  4. Powershell を開きます (Vista/Win7 のアクセサリまたは WinXP の Powershell にあります)。上記のスクリプトを保存したディレクトリに移動して実行します。「このシステムではスクリプトの実行が無効になっています」というエラーが表示された場合は、次を実行します。

    Set-ExecutionPolicy RemoteSigned
    

    PowerShell で、署名なしでローカル スクリプトを実行できるようにします。

それはそれを行う必要があります。すべてがうまくいけばC:\dest_repos\svn addすべてのファイルを新しいリポジトリとsvn commitそれらに移動できるはずです。

私が説明しようとしたことについて質問がある場合、または奇妙なエラーに遭遇した場合は、お知らせください。スクリプトの表面的なテストを行いましたが、いくつかのエッジ ケースを忘れている可能性は十分にあります。

リポジトリの復元を頑張ってください!

于 2010-03-04T20:36:14.797 に答える