【问题标题】:How to SVN relocate multiple directoriesSVN如何重定位多个目录
【发布时间】:2021-03-22 22:46:38
【问题描述】:

我想重新定位我本地机器上多个签出的 SVN 目录,因为我们的 SVN 服务器移动了,现在有一个不同的 IP 地址。我不想通过 SmartSVNTortoiseSVN 之类的工具执行此操作,而是想使用脚本一次性完成目录。

每个目录都包含一个不同的工作副本——所以要么是一个不同的项目,要么有时还有一个不同的分支或标签,因此我不能只在根目录中进行重定位。

【问题讨论】:

    标签: bash svn shell


    【解决方案1】:

    我在一个已经消失的网页上找到了部分解决方案,并且在 cmets 中找到了一个改进版本,但我想稍微清理一下并在这里提供给其他人

    IP 地址是虚构的,需要根据本地设置进行调整。

    脚本遍历所有由 SVN 管理的目录并使用旧位置,然后调用 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

    【讨论】:

    • 部分解决方案的 URL 似乎链接到一个空页面......很奇怪。
    • 部分解决方案链接现在指向 NSFW 页面!
    【解决方案2】:

    @nwinkler 的解决方案在我的机器上不起作用,因为我的 grep 版本不支持选项 -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 匹配,则将其重新定位

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2015-03-22
      • 1970-01-01
      • 2010-09-24
      • 2020-05-05
      • 2020-04-06
      • 2012-05-03
      • 2013-01-31
      • 2011-06-26
      相关资源
      最近更新 更多