我想在我的本地机器上重新定位多个签出的 SVN 目录,因为我们的 SVN 服务器已移动并且现在具有不同的 IP 地址。我不想通过SmartSVN或TortoiseSVN之类的工具执行此操作,而是想使用脚本一次性完成目录。
每个目录都包含一个不同的工作副本——所以要么是一个不同的项目,要么有时还有一个不同的分支或标签,因此我不能只在根目录中进行重定位。
我在一个消失的网页上找到了部分解决方案,在评论中也找到了一个改进的版本,但我想稍微清理一下并在这里提供给其他人
IP 地址是虚构的,需要根据本地设置进行调整。
该脚本遍历所有由 SVN 管理的目录并使用旧位置,然后svn switch
为每个目录调用带有 relocate 选项的命令。
#!/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
在脚本顶部定义。
@nwinkler 的解决方案在我的机器上不起作用,因为我的版本grep
不支持该选项-o
(Msys 中的 grep 2.4.2)。
我想出了另一个解决方案,它也有以下改进:
代码要长得多,也没有那么优雅,但它可以解决问题。
该脚本应从包含本地存储库的目录中运行。
#!/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--#
方法略有不同: