svn 勾子自动同步post-commit(亲测使用)

此博客给出了一个SVN提交更新的脚本。脚本可记录仓库、提交版本、作者、备注等信息,根据提交更新的目录判断是否需要更新目标路径,更新时使用指定的SVN用户和密码,最后记录操作耗时和修改目录到日志文件,运行环境为Linux。

#!/bin/sh

export LANG=en_US.UTF-8
#仓库
REPOS="$1"
#提交版本
REV="$2"
SVN_LOOK_PATH=/usr/bin/svnlook
SVN_PATH=/usr/bin/svn
#svn用户
SVN_USER=svnUser
#svn用户密码
SVN_PASS=svnPass
#更新的目录
CHANGEDDIRS=$($SVN_LOOK_PATH dirs-changed $REPOS)
#提交作者
AUTHOR=$($SVN_LOOK_PATH author -r $REV "$REPOS") 
#提交的备注
MESSAGE=$($SVN_LOOK_PATH log -r $REV "$REPOS") 
TIME=$(date "+%Y-%m-%d %H:%M:%S")
S_TIME=$(date +%s)
#日志文件
SVN_LOG_FILE=/var/log/svn/svn_log.log
#目标路径
TARGET_PATH=/data/game1
exec 1>>"$SVN_LOG_FILE" 
exec 2>&1
#需要更新的路径
SVN_UP_PATH_ARRAY=(
trunk/json
trunk/server
trunk/client
)
function myecho() {   
    echo "$TIME" "$*" 
}   

is_need_update() {
    for var in ${SVN_UP_PATH_ARRAY[@]};  
    do
        if [ $flag = false ] 
        then
            if [[ $1 == $var* ]]
            then
                  flag=true
            fi 
        fi  
    done 
}

for dir in $CHANGEDDIRS
do
    flag=false
    is_need_update $dir
    if [ $flag = true ]
    then 
        $SVN_PATH update  $TARGET_PATH/$dir  --username $SVN_USER --password $SVN_PASS --no-auth-cache

    fi
done

E_TIME=$(date +%s)
COST_TIME=`expr $E_TIME - $S_TIME`
myecho
myecho "**************************************************************"
myecho "提交版本:$REV 作者:$AUTHOR"
myecho "提交备注:$MESSAGE"
myecho "耗时:$COST_TIME"
myecho "修改目录:$(echo $CHANGEDDIRS | tr '\n' ' | ')"


 

<think>嗯,用户之前问过关于svnlook提交者用户名的来源,现在又转向了VisualSVN Server的post-commit.bat脚本输出用户具体操作。我需要先回顾之前的对话,确保这次的回答连贯且准确。 首先,用户可能在使用VisualSVN Server,想通过post-commit钩子脚本来记录用户的操作细节。他们可能想监控提交行为,或者需要审计日志。用户的需求可能包括获取提交者信息、变更的文件列表、提交日志等。 接下来,我需要解释post-commit.bat的作用,以及如何编写这样的脚本。需要强调钩子脚本的位置,如何访问版本库路径、版本号等参数。同时,要说明svnlook工具的使用,比如如何获取作者、时间、日志和变更的文件。 需要注意的是,用户可能对批处理脚本不太熟悉,所以示例代码要简洁明了。还要提醒用户注意权限问题,脚本的执行权限和路径是否正确。另外,日志路径的可访问性也很重要,可能需要管理员权限才能写入。 可能用户还想知道如何扩展脚本的功能,比如发送邮件或集成其他系统,这时候需要给出一些方向,但保持回答简洁。此外,安全方面也要提醒,避免在脚本中暴露敏感信息。 用户可能的误区是认为钩子脚本可以直接阻止提交,但post-commit是在提交后执行的,无法阻止。如果有需要,应该使用pre-commit钩子。不过用户的问题是关于记录信息,所以这点可能不需要深入,但如果有疑问的话,可以简要说明。 最后,确保回答结构清晰,分步骤说明,并给出验证方法和注意事项,帮助用户顺利实现他们的需求。</think>在 VisualSVN Server 中,`post-commit.bat` 是一个 **提交后钩子脚本**(Post-Commit Hook),它会在用户成功提交代码到仓库后自动触发。通过编写此脚本,可以记录用户的具体操作(如提交者、提交时间、修改的文件等),并实现自定义操作(如发送通知、备份、日志记录等)。 --- ### **1. 脚本的核心作用** - **捕获提交信息**:通过 `svnlook` 命令提取提交的元数据(作者、时间、日志等)。 - **记录用户操作**:将提交信息输出到日志文件或发送到其他系统(如邮件、数据库等)。 - **触发后续动作**:例如自动部署代码、同步文件、调用 API 等。 --- ### **2. 脚本位置与参数** - **默认路径**:位于仓库的 `hooks` 目录下(例如 `C:\Repositories\MyRepo\hooks\post-commit.bat`)。 - **输入参数**: - `%1`:仓库的绝对路径(如 `C:\Repositories\MyRepo`)。 - `%2`:本次提交的修订版本号(如 `123`)。 --- ### **3. 示例脚本:记录用户操作到日志文件** 以下是一个简单的 `post-commit.bat` 脚本示例,用于输出用户操作到日志文件: ```batch @echo off setlocal set REPOS=%1 set REV=%2 REM 使用 svnlook 提取提交信息 set AUTHOR=$(svnlook author "%REPOS%" -r %REV%) set DATE=$(svnlook date "%REPOS%" -r %REV%) set LOG=$(svnlook log "%REPOS%" -r %REV%) set CHANGED_FILES=$(svnlook changed "%REPOS%" -r %REV%) REM 定义日志文件路径(需确保路径可写) set LOG_FILE=C:\SVN_Logs\commit_log.txt REM 写入日志 echo ======================================= >> "%LOG_FILE%" echo [提交时间] %DATE% >> "%LOG_FILE%" echo [提交者] %AUTHOR% >> "%LOG_FILE%" echo [修订版本] %REV% >> "%LOG_FILE%" echo [提交日志] %LOG% >> "%LOG_FILE%" echo [变更文件] >> "%LOG_FILE%" echo %CHANGED_FILES% >> "%LOG_FILE%" endlocal ``` -- ### **4. 关键点说明** #### **(1) 使用 `svnlook` 提取信息** - **作者**:`svnlook author <仓库路径> -r <版本号>` - **时间**:`svnlook date <仓库路径> -r <版本号>` - **日志消息**:`svnlook log <仓库路径> -r <版本号>` - **变更文件列表**:`svnlook changed <仓库路径> -r <版本号>`(输出增删改的文件列表) #### **(2) 日志文件路径** - 需确保脚本有权限写入目标文件(例如 `C:\SVN_Logs` 目录需要开放写入权限)。 - 建议使用绝对路径,避免权限或路径解析问题。 #### **(3) 增强功能(可选)** - **发送邮件**:调用命令行邮件工具(如 `blat`)或 PowerShell 发送提交通知。 - **调用 API**:通过 `curl` 或 `PowerShell` 将提交信息发送到 Web 服务。 - **备份操作**:自动复制提交的文件到备份目录。 --- ### **5. 脚本调试与权限** - **调试方法**: 1. 手动执行脚本: ```batch post-commit.bat "C:\Repositories\MyRepo" 123 ``` 2. 检查日志文件是否生成。 - **权限问题**: - 如果脚本未执行,检查 `post-commit.bat` 是否有可执行权限。 - 确保 VisualSVN Server 服务账户(默认是 `Local System` 或 `Network Service`)有权限访问脚本和日志目录。 --- ### **6. 注意事项** 1. **脚本性能**:避免在 `post-commit.bat` 中执行耗时操作(如大文件备份),否则会阻塞后续提交。 2. **错误处理**:在脚本中添加错误捕获(如 `if %errorlevel% neq 0`),防止因脚本异常导致提交失败。 3. **安全风险**:不要直接在脚本中暴露敏感信息(如密码),必要时使用加密或环境变量。 --- ### **7. 扩展:通过 PowerShell 实现更复杂逻辑** 如果需要更灵活的操作(如解析文件内容、调用 .NET 库),可以使用 `post-commit.ps1`(PowerShell 脚本)替代批处理文件: ```powershell param($repos, $rev) $author = svnlook author $repos -r $rev $log = svnlook log $repos -r $rev $files = svnlook changed $repos -r $rev | ForEach-Object { $_ -replace '^....', '' } # 去掉文件操作标记(A/D/M) # 记录到日志 "提交者: $author, 版本: $rev, 时间: $(Get-Date)" | Out-File C:\SVN_Logs\log.txt -Append "变更文件: $files" | Out-File C:\SVN_Logs\log.txt -Append ``` --- ### **8. 总结** 通过 `post-commit.bat` 脚本,可以精准记录用户的 SVN 操作,实现以下功能: - **审计追踪**:记录谁在什么时间修改了哪些文件。 - **自动化流程**:触发代码部署、试或备份。 - **通知机制**:向团队发送提交通知。 如果需要更高级的功能,建议结合 PowerShell 或 Python 脚本实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值