SVN比较两个文件夹并在命令提示符中导出差异
SVN compare two folders and export differences in Command Prompt
如何在 SVN 中比较两个文件夹并在 windows 命令提示符 中将差异导出到另一个文件夹?
使用 tortoise svn gui,我们可以比较两个 URLS select 并将 selection 文件导出到一个文件夹。如export changed files using tortoise svn to another directory中所述。
是否可以从命令提示符执行此操作?!
我在 https://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-automation.html 看到了命令列表,但找不到任何东西。
我在 https://www.electrictoolbox.com/subversion-export-changed-files-cli/ 找到了一个脚本,但它是针对 linux、
我更改了您提到的 shell script for Linux 以使用 Windows。第一个变体 (svn-export.bat
) 适用于存储库中的两个不同修订版。第二个变体 (svn-localexport.bat
) 将使用两个本地目录。
它使用svn diff --summarize -r revision-from:revision-to repository
as 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 语句。
如何在 SVN 中比较两个文件夹并在 windows 命令提示符 中将差异导出到另一个文件夹?
使用 tortoise svn gui,我们可以比较两个 URLS select 并将 selection 文件导出到一个文件夹。如export changed files using tortoise svn to another directory中所述。
是否可以从命令提示符执行此操作?!
我在 https://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-automation.html 看到了命令列表,但找不到任何东西。
我在 https://www.electrictoolbox.com/subversion-export-changed-files-cli/ 找到了一个脚本,但它是针对 linux、
我更改了您提到的 shell script for Linux 以使用 Windows。第一个变体 (svn-export.bat
) 适用于存储库中的两个不同修订版。第二个变体 (svn-localexport.bat
) 将使用两个本地目录。
它使用svn diff --summarize -r revision-from:revision-to repository
as 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 语句。