2013-04-11 12 views
-1

我有一個本地文件夾-A具有許多子文件夾(SVN版本庫),這些子文件夾都有一個子文件夾名爲.svn文件。現在我想將所有.svn目錄到文件夾-B,但櫃面1天我希望.svn目錄回到他們原來的地方,所以我可以SVN更新它們,因此「.svn文件」文件夾的父文件夾的信息必須在退出文件夾-BWindows批處理命令,將所有希望子recrusively在目錄中的新文件夾

開始像這樣:

Folder-A 
|_DR1 
    |_.svn 
    |_s1 
     |_.svn 
     |_s1_s1folder 
     |_.svn 
     |_file1 
     |_file1 
    |_s2 
     |_.svn 
     |_file1 
     |_file2 
|_DR2 ... etc 

期望MOVE結果:

Folder-A only have actual sub-folders and data but without .svn folder 

Folder-B 
|_DR1 
    |_.svn 
    |_s1 
     |_s1_s1folder 
     |_.svn 
     |_.svn 
    |_s2 
     |_.svn 
|_DR2 ... etc 

所需的恢復結果:

文件夾-A &文件夾-B回到我們開始的地方。

請幫忙寫COMMANDLINES來完成MOVE和RESTORE使命,謝謝

回答

1
@ECHO OFF 
SETLOCAL 
:: establish source and destination directorynames; ensure dest exists 
SET source=c:\folder-a 
SET dest=u:\folder-b 
MD %dest% 2>NUL 
:: delete a tempfile if it exists 
DEL "%temp%\svntmp2.tmp" 2>nul 
:: create a dummy directory 
MD c:\dummy 
:: go to root of tree containing SVN directories 
PUSHD "%source%" 
XCOPY /L /s . c:\dummy |find /i "\svn\" >"%temp%\svntmp1.tmp" 
POPD 
:: goto destination directory 
PUSHD "%dest%" 
FOR /f "delims=" %%i IN ('type "%temp%\svntmp1.tmp"') DO CALL :moveit "%%i" 
FOR /f "delims=" %%i IN (
'TYPE "%temp%\svntmp2.tmp"^|sort /r' 
) DO RD "%%i" /S /Q 
POPD 

:: delete tempfiles 
del "%temp%\svntmp1.tmp" 
del "%temp%\svntmp2.tmp" 

:: delete the dummy directory 
RD /s /q c:\dummy 

GOTO :eof 

:moveit 
:: get filename, remove quotes, then remove leading '.' 
SET sourcefile=%~1 
SET sourcefile=%sourcefile:~1% 
FOR %%i IN ("%sourcefile%") DO (
MD ".%%~pi" 2>nul 
MOVE "%source%%%~i" ".%%~pnxi" 
>>"%temp%\svntmp2.tmp" ECHO %source%%%~pi 
) 

GOTO :eof 
  • 設置你的源和目標目錄。
  • 做一個假的空目錄
  • 去源並生成文件列表使用 XCOPY/L和過濾含有\svn\
  • 去你的目標目錄
  • 移動的每個文件的行移動
    • 刪除領先的'。'從XCOPY輸出
    • 創建目標子目錄;忽略「已經存在」錯誤
    • 移動文件
    • 記錄目錄名中第二個臨時文件
  • 排序第二臨時文件相反,這使第一
  • 除去目錄最深的子目錄,無視「它不存在」錯誤
  • 刪除臨時文件和虛擬目錄。

注意,命令實際上DO的移動/目錄下創建/刪除僅僅是ECHO版。這樣就可以驗證例程是否執行了你想要的操作。您需要驗證它是否正確,然後從語句中刪除ECHO關鍵字以實際激活移動。爲了安全起見,首先測試一個小的虛擬區域。

至於恢復 - 這是比較容易的。

xcopy /s/e/v "...folder-b\dr1\svn\" "\folder-a\dr1\svn\" 

應該做你想做的,保持在文件夾-B恢復的項目文件(刪除,如果你喜歡 - 這是你的系統),你可以在一個項目上,通過項目爲基礎恢復。

(我用SVN由於各地點越來越小了一點我現在...)

+0

它更復雜的話,我想。 3q – explorer 2013-04-12 02:05:32

+0

還沒有驗證,我覺得它更復雜,我非常感謝。我已經完成了這項工作:將我的svn-repository升級到1.7,所以.svn文件夾將只存在於root-DIR中,其餘的將是一個小案例。但仍然存在一個性能問題,這是一個緩慢的過程,我的文件夾-A約爲10G,將.svn成本移動大約15分鐘。看來windows的robocopy/MOVE命令是一個「copy&Delte」動作,而不是真正的MOVE(例如在windows-explorer中的Ctrl-X Ctrl-V非常快),也許最終的解決方案將取決於cscript.exe等等 – explorer 2013-04-12 02:28:32

相關問題