我想在Subversion中通过post-commit钩子运行批处理文件。我的问题是我想为已经提交的每个文件运行一次,但是我不知道如何在钩子中获取提交文件的名称。我能够为文件夹中的每个文件运行它,但是当我离开这个测试环境并且实际使用这个功能时,有很多文件,这将是非常低效的。任何想法??
答案 0 :(得分:1)
SVN向钩子传递两个值,即存储库的路径和生成的修订号 使用此信息,您可以向SVN询问该修订中更改的路径,并获取添加/修改的文件列表。
答案 1 :(得分:1)
你只犯了一个小错误:事务中的文件列表(服务器端,因为在服务器上执行的钩子)可以比svn log -v
更容易准备(并且没有“日志的”噪音“)。它是svnlook
子命令changed
repo中的修订示例(对于您将使用的事务-t %TXN%
)
>svnlook.exe changed -r 31 Hello
U trunk/Hello.de.txt
U trunk/Hello.en.txt
U trunk/Hello.fr.txt
Hello
是存储库 root(不是工作副本)的路径,命令输出部分显示为svn st
的输出,文件路径是repo-的相对路径根
答案 2 :(得分:0)
我能够使用批处理并使用一些临时文本文件来存储一些数据。我不得不做一些处理来获取变量中文件的名称,因为这是我作为参数所需要的。这可能不是最有效的方法,但它实现了我的目标......
setlocal EnableDelayedExpansion
rem write a list of the changed files in a text file
"C:\svnpath\bin\svn.exe" log "C:\repo-path\project" -r %TXN% --verbose > "C:\path\changelist.txt"
rem write the list of all files into a text file
cd "C:\repo-path\project"
dir /b > "C:\path\filelist.txt"
rem loop through files
cd "C:\path"
for /F "delims=" %%i IN (filelist.txt) do (
rem search for file name in list of changed files, if found run batch file on it
find /i "%%i" changelist.txt > nul
echo %%i > "C:\path\temp.txt"
if not errorlevel 1 (
cd "C:\repo-path\project"
batchfile.bat %%i
)
)
rem delete temp files when finished
del "C:\path\filelist.txt"
del "C:\path\changelist.txt"
del "C:\path\changedfiles.txt"