2012-08-13 92 views
1

我想重新定位我的本地機器上檢出多個SVN目錄,因爲我們的SVN服務器已移動,現在有不同的IP地址。相反,通過像的SmartSVNTortoiseSVN的的工具這樣做的,我想用一個腳本來執行的目錄中一個橫掃。如何SVN重定位多個目錄

每個目錄都包含不同的工作副本 - 所以不管是不同的項目或有時也不同分支或標記,所以我不能只是做在根目錄下的搬遷。

回答

2

我找到了部分解決方案here,並在評論的改進版本,但我想清理一下,這裏的其他人提供它,以及

的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

+0

的部分解決方案的URL似乎鏈接到一個空白頁...怪異。 – 2016-08-11 11:31:27

1

由於我的版本grep不支持選項-o(Msys中的grep 2.4.2),因此@nwinkler的解決方案無法在我的機器上運行。

我想出了這也有如下改進這個其他的解決方案:

  • 與空間的目錄名稱的支持
  • 幾個 舊倉庫網址(如服務器名稱和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匹配,在重新定位