SVN比较两个文件夹并在命令提示符下导出差异



如何在SVN中比较两个文件夹并将差异导出到Windows命令提示符下的另一个文件夹?

使用Tortoise svn gui,我们可以比较两个URL全选并将选择文件导出到一个文件夹中。如中所述,使用 turtoise svn 将更改的文件导出到另一个目录。

是否可以从命令提示符下执行此操作?!

我在 https://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-automation.html 看到命令列表,但找不到任何东西。

我在 https://www.electrictoolbox.com/subversion-export-changed-files-cli/找到了一个脚本,但它是针对 linux 的,

我更改了您提到的Linux的shell脚本以与Windows一起使用。第一个变体(svn-export.bat(适用于存储库中的两个不同修订版。第二个变体(svn-localexport.bat(将处理两个本地目录。

它使用svn diff --summarize -r revision-from:revision-to repositoryas svn 命令来工作。创建批处理文件:svn-export.bat将以下内容复制到其中并通过以下方式使用:

svn-export revision-from revision-to repository target-directory

SVN-export.bat:

@echo off
setlocal enabledelayedexpansion
set INVARGS=0
if [%1] == [] set INVARGS=1
if [%2] == [] set INVARGS=1
if [%3] == [] set INVARGS=1
if [%4] == [] set INVARGS=1
if %INVARGS% == 1 (
echo Usage: %0 ^<revision_from^> ^<revision_to^> ^<repository^> ^<target_directory^>"
goto eof
)
rem set up nice names for the incoming parameters to make the script more readable
set "revision_from=%1"
set "revision_to=%2"
set "repository=%3"
set "target_directory=%~4"
rem the findstr is needed so we only get added/modified files and not the deleted ones or anything else
set "svnCommand=svn diff --summarize -r%revision_from%:%revision_to% %repository% ^| findstr /B "[AM]""
if not exist "%target_directory%" ( mkdir "%target_directory%" )
rem go into target directory
pushd "%target_directory%"
for /f "delims=" %%L in ('%svnCommand%') do (
rem convert line like: "A       http://..." to "http://..."
set "filename=%%L"
rem echo.before: ^<!filename!^>
set "find=*%repository%/"
call set filename=%%filename:!find!=%%
rem echo.after:  ^<!filename!^>
rem don't export if it's a directory we've already created
if not exist "!filename!" (
for %%F in ("!filename!") do set "directory=%%~dpF"
if not exist "!directory!" ( mkdir "!directory!" )
svn export -r %revision_to% %repository%/!filename! "%cd%!filename!"
)
)
popd
rem to summarize any deleted files or directories at the end of the script uncomment the following lines
rem echo.Deleted files:
rem svn diff --summarize -r%revision_from%:%revision_to% %repository% | findstr /B "[D]"
:eof

下一个脚本几乎相同,但它比较了由 svn 管理的两个本地目录。因此,它使用:svn diff --summarize --old folder-old --new folder-new作为 svn 命令。通过以下方式使用它:

svn-localexport folder-old folder-new target-directory

svn_localexport.bat:

@echo off
setlocal enabledelayedexpansion
set INVARGS=0
if [%1] == [] set INVARGS=1
if [%2] == [] set INVARGS=1
if [%3] == [] set INVARGS=1
if %INVARGS% == 1 (
echo Usage: %0 ^<folder_old^> ^<folder_new^> ^<target_directory^>"
goto eof
)
rem set up nice names for the incoming parameters to make the script more readable
set "folder_old=%~1"
set "folder_new=%~2"
set "target_directory=%~3"
pushd "%folder_old%"
set "folder_old_abs=%cd%"
popd
pushd "%folder_new%"
set "folder_new_abs=%cd%"
popd
rem the findstr is needed so we only get added/modified files and not the deleted ones or anything else
set "svnCommand=svn diff --summarize --old "%folder_old_abs%" --new "%folder_new_abs%" ^| findstr /B "[AM]""
if not exist "%target_directory%" ( mkdir "%target_directory%" )
rem go into target directory
pushd "%target_directory%"
for /f "delims=" %%L in ('%svnCommand%') do (
rem convert line like: "A       C:Users...src.c" to "src.c"
set "filename=%%L"
rem echo.before: ^<!filename!^>
set "find=*%folder_old_abs%"
call set filename=%%filename:!find!=%%
rem echo.after:  ^<!filename!^>
rem don't export if it's a directory we've already created
if not exist "!filename!" (
for %%F in ("!filename!") do set "directory=%%~dpF"
if not exist "!directory!" ( mkdir "!directory!" )
echo copy "%folder_new_abs%!filename!" "%cd%!filename!"
copy "%folder_new_abs%!filename!" "%cd%!filename!"
)
)
popd
rem to summarize any deleted files or directories at the end of the script uncomment the following lines
rem echo.Deleted files:
rem svn diff --summarize --old "%folder_old_abs%" --new "%folder_new_abs%" | findstr /B "[D]"
:eof

请注意,如果目标文件已存在,则这两个批处理脚本都不会覆盖它们。如果要更改该语句,请删除相应的 if 语句。