如何SVN重定位多个目录

时间:2012-08-13 11:48:04

标签: bash svn shell

我想在本地计算机上重新定位多个已检出的SVN目录,因为我们的SVN服务器已移动,现在具有不同的IP地址。而不是通过像 SmartSVN TortoiseSVN 这样的工具来实现这一点,我想使用脚本在一次扫描中完成目录。

每个目录包含不同的工作副本 - 因此要么是不同的项目,要么是有时也是不同的分支或标记,因此我不能只在根目录中进行重定位。

2 个答案:

答案 0 :(得分:2)

我找到了部分解决方案here,并在评论中也提供了改进版本,但我想稍微清理一下并在此处为其他人提供

IP地址是虚构的,需要调整为本地设置。

该脚本遍历由SVN管理的所有目录并使用旧位置,然后使用每个的relocate选项调用svn switch命令。

#!/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

答案 1 :(得分:1)

@nwinkler的解决方案无法在我的机器上运行,因为我的grep版本不支持-o选项(Msys中的grep 2.4.2)。

我提出了另一个解决方案,它也有以下改进:

  • 支持带空格的目录名
  • 支持多个旧存储库网址(例如服务器名称和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匹配,则将其重新定位