1

SVN サーバーが移動し、別の IP アドレスになったため、チェックアウトした複数の SVN ディレクトリをローカル マシンに再配置したいと考えています。SmartSVNTortoiseSVNなどのツールを使用してこれを行う代わりに、スクリプトを使用してディレクトリを 1 回のスイープで実行したいと考えています。

各ディレクトリには異なる作業コピーが含まれています。つまり、異なるプロジェクトか、場合によっては異なるブランチまたはタグでもあるため、ルート ディレクトリで再配置することはできません。

4

2 に答える 2

2

消えた Web ページで部分的な解決策を見つけ、コメントで改善されたバージョンも見つけましたが、少しクリーンアップして他の人にも提供したかったのです。

IP アドレスは架空のものであり、ローカル設定に合わせて調整する必要があります。

スクリプトは、SVN によって管理され、古い場所を使用するすべてのディレクトリを反復処理し、それぞれの場所にsvn switchrelocate オプションを指定してコマンドを呼び出します。

#!/bin/bash

OLD_REPO=http://127.0.0.1/svn/
NEW_REPO=http://192.168.0.17/svn/

for dir in `ls -1 */.svn/entries | xargs grep -H -l $OLD_REPO | grep -E -o ^[^\/]+`; do
    echo Switching sandbox $dir from $OLD_REPO to $NEW_REPO;
    
    OLD_ROOT=`svn info $dir | grep ^Repository\ Root | cut -f 3 -d ' '`
    NEW_ROOT=`echo $OLD_ROOT | sed "s|$OLD_REPO|$NEW_REPO|"`
    svn switch --relocate $OLD_ROOT $NEW_ROOT $dir;
done

移動中にユーザーも変更したい場合は--username $USERNAME、コマンドにパラメーターのようなものを追加$USERNAMEし、スクリプトの先頭で を定義するのは簡単です。

于 2012-08-13T11:48:03.800 に答える
1

grep私のバージョンの@nwinklerはオプションをサポートしていないため、@nwinklerの解決策は私のマシンでは機能しませんでした-o(Msysのgrep 2.4.2)。

次の改善点もあるこの他のソリューションを思いつきました。

  • スペースを含むディレクトリ名のサポート
  • いくつかの古いリポジトリURLのサポート(サーバー名と IP アドレスなど)

コードははるかに長く、エレガントではありませんが、うまく機能します。

スクリプトは、ローカル リポジトリを含むディレクトリから実行されます。

#!/bin/bash

#Change separator to support directories with space
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

#URL of new 
NEW_REPO=http://newserver:8080/svn/

#List of potential old repositories
OLD_REPOS[0]=http://oldserver:8080/svn/
OLD_REPOS[1]=http://oldserver.domain.com:8080/svn/
OLD_REPOS[2]=http://127.0.0.1:8080/svn/


for dir in `ls -d1 *`; do
    #Check directory and skip if needed
    if ! [ -d "$dir/.svn" ]; then
        continue;
    fi  
    #Relocate
    OLD_ROOT=`svn info $dir | grep ^Repository\ Root | cut -f 3 -d ' '`
    if [ "`echo $OLD_ROOT | grep $NEW_REPO`" == "$OLD_ROOT" ]; then
        echo "Skipped repository '$dir' (already relocated)";
    else
        for OLD_REPO in ${OLD_REPOS[*]}; do
            NEW_ROOT=`echo $OLD_ROOT | sed "s|$OLD_REPO|$NEW_REPO|"`;
            if [ "$OLD_ROOT" != "$NEW_ROOT" ]; then
                echo "Switching repository '$dir' from $OLD_REPO to $NEW_REPO";
                svn switch --relocate $OLD_ROOT $NEW_ROOT $dir;
                echo "=> done";
                continue 2;
            fi
        done
        echo "Repository '$dir' does not match any old repository identified";
    fi
done

#Restore separator
IFS=$SAVEIFS

#--END--#

アプローチは少し異なります。

  • すべてのファイルとディレクトリをループする
  • SVN リポジトリでない場合はスキップ
  • ローカル リポジトリが古いリポジトリの URL と一致する場合は、再配置されます
于 2016-08-11T11:36:38.663 に答える