开发svn hook阻止svn仓库特定分支的commit log中不包含关键字的提交

2023-11-10

使用批处理脚本实现开发svn hook(pre-commit) 阻止svn仓库特定分支的commit log中不包含关键字的提交(批处理脚本+shell脚本实现)
  • 实现逻辑
    1)使用svnlook 的dirs-changed子命令去获取当前仓库的提交事务中子文件发生变化的目录,
    2)如果发现该路径下有该子路径则将DIR_FOUND标志变量设置为true,接下来对该子路径进行判断,
    3)如果发现标志的值是true,则在此子路径上使用svnlook log命令获取当前仓库提交事务的log中是否包含提交关键字,如果没有则限制提交。
  • 想让svn hook对svn仓库多个分支进行限制的实现逻辑
    1)如果想设置多个子路径,则可以在用svnlook 的dirs-changed子命令的这个for循环中增加一条子路径判断语句,
    2)并增加一个DIR_FOUND1标志变量,并在下方的if条件中增加一个DIR_FOUND1标志变量是否为true的判断即可。
    注意:svn hook默认为整个仓库的根目录起效,我们如果只想对仓库的某几个分支起效,则可这样去处理。
  1. windows环境下使用批处理脚本实现:
@echo off
setlocal

set REPOS=%1
set TXN=%2
set SVNLOOK=/usr/bin/svnlook
set KEYWORD=SOP-
set SEARCH_PATH=branches/dev
set SEARCH_PATH1=trunk
set FOUND=false
set DIR_FOUND=false
set DIR_FOUND1=false

for /f "delims=" %%G in ('svnlook dirs-changed -t %TXN% %REPOS%') do (
    echo %%G | findstr "%SEARCH_PATH%" >nul && set "DIR_FOUND=true"
    echo %%G | findstr "%SEARCH_PATH1%" >nul && set "DIR_FOUND1=true"
)

if not "%DIR_FOUND%"=="true" if not "%DIR_FOUND1%"=="true" (
    exit 0
)

for /f "delims=" %%G in ('('svnlook  log -t %TXN% %REPOS%') do (
    echo %%G | findstr "%KEYWORD%" >nul && set "FOUND=true"
)

if not "%FOUND%"=="true" (
    echo The commit message does not contain '%KEYWORD%' keyword. >&2
    exit 1
)

exit 0
  1. 在Linux下使用shell脚本实现:

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
KEYWORD="SOP-"
SEARCH_PATH="branches/dev"
SEARCH_PATH="trunk"
DIR_FOUND=false
DIR_FOUND1=false
FOUND=false

for dir in `$SVNLOOK dirs-changed -t "$TXN" "$REPOS"`; do
    echo "$dir" | grep -q "$SEARCH_PATH" && DIR_FOUND=true
    echo "$dir" | grep -q "$SEARCH_PATH1" && DIR_FOUND1=true
done

if [ "$DIR_FOUND" != "true" ] && [ "$DIR_FOUND1" != "true" ]; then
    exit 0
fi

for log in `$SVNLOOK log -t "$TXN" "$REPOS"`; do
    echo "$log" | grep -q "SOP-[0-9]\+" && FOUND=true
done

if [ "$FOUND" != "true" ]; then
    echo "The commit message does not contain '$KEYWORD' keyword." >&2 
    exit 1
fi

exit 0

注意1) : shell中grep使用正则表达式进行任务号grep DEVOPS-[0-9]时,使用+时需要在前边增加反斜线例如
(使用基本的正则表达式元字符?、+、11、(和)时都需要在前边加) ; 也可以使用grepE"SSP[0-9]+"进行任务号匹配.
注意2):在进行路径填写时需要用/,例如branches/dev; (windows批处理下路径若使用branches\dev会造成svn hook失效)

接下来考虑在pre-commit hook script中增加对其他路径未包含任务号提交限制的实现

  • 想让svn hook对svn仓库多个分支进行限制的实现逻辑:可以在该for循环中增加一个路径匹配判断语句,并增加一个DIR_FOUND1标志变量:
for dir in `SSVNLOOK dirs-changed -t "STKN" "$REPOS": do
    echo "$dir"grep"$SEARCH PATH" DIR_FOUND=true
    echo "$dir"grep"$SEARCH_PATH1" DIR_FOUND1=true
done

然后在这个for循环的if语句中增加对DIR_FOUND1是否为true的判断即可实现svn hook对多个分支起效:

if["$DIR FOUND" exit"true"] &&[ "$DIR_FOUND1" != "true" ]; then
   exit 0
fi
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发svn hook阻止svn仓库特定分支的commit log中不包含关键字的提交 的相关文章

  • Subversion 中的单个文件合并

    我正在使用 Subversion 1 5 并且在一个分支中有一个文件 我想将其合并到另一个分支中 当我做一个svn merge http path to file我收到一个错误 无法用 替换目录 这是否意味着 Subversion 无法做到
  • 如何使用 Subversion 服务器删除和创建新的存储库?

    好吧 我只是做了一些愚蠢的事情 我正在第一次设置一个供承包商使用的颠覆服务器 我完成了一键设置 创建了我的项目 并第一次签入了我们的应用程序 我认为稍后会进行操作并删除配置文件中连接字符串中的密码信息 Duh 所以现在我需要删除存储库中的该
  • 你已经从颠覆转向善变了吗?值得付出努力吗?

    我正在更好地了解 Mercurial 版本控制系统 并且正在考虑从 SVN 进行转换 有人已经转换了吗 对于您和您的团队来说 转变是否困难 您能否给出一些建议 是继续使用 SVN 还是选择 Mercurial 一旦开始 你就永远不想回去 优
  • 将大型 SVN 存储库迁移到 git

    我有一个大型 SVN 存储库 大约 140GB 其中包含许多项目 并且不遵循 svn 推荐的目录结构 从所有这些数据 包括二进制文件 发布版本和依赖项 来看 我真正关心的是特定路径 与其他所有数据相比 该路径实际上具有非常小的历史记录 到目
  • 如何阻止 SVN Checkout 恢复从项目中删除的文件?

    我们是 subversion tortoisesvn ankhsvn 堆栈的新手 虽然在 Studio 2008 中我们从项目中删除了文件 但问题是当我们在 CI 构建中执行 svn checkout 时 我们会得到已删除的文件 如何防止这
  • 如何通过FTP将多个多级(不同层次)文件从本地版本覆盖到在线版本

    我只是在本地更改了几个不同目录中的许多文件 然后将更改推送到 Subversion 但这不会更改实时版本 只会更改存储库 现在我必须通过 FTP 更新这些文件 但它们都是不同的层次结构级别 我怎么做 我知道的唯一方法是采用我的整个本地版本并
  • 将svn迁移到git的子目录

    我想用 git 替换我的 svn 存储库 不幸的是 我无法一次性完成此操作 长话短说 我需要将带有历史记录的 svn 存储库移动到预先存在的 git 存储库的子目录中 所以我目前有 svn svn1 svn2 git git1 git gi
  • svn 可以提供哪些报告?

    我们正在迁移到 SVN 对我们来说不幸的是 我们会定期接受审核 审核员需要以下信息 文件更改历史记录SVN访问历史添加了新文件文件的变化 是否有一个工具可以为我们生成这些报告 或其中一些报告 StatSVN是一个轻量级的颠覆报告生成器 ht
  • 检查服务器上文件的差异

    我的机器上有一个存储库的工作副本 并且我知道它已在服务器上更新 我想知道如何通过使用来获取新版本和工作副本中的版本之间的差异svn命令行参数 我有办法做到这一点吗 工作副本是修订版 BASE 存储库中的最新副本是修订版 HEAD 这会将您的
  • 不在办公室时进行源代码控制

    有时我不在办公室时会编写代码 我想在未连接到公司网络时继续使用源代码控制的好处 我理想的系统将允许我将修订签入笔记本电脑上的存储库 然后当我连接到公司网络时 该存储库将与我们的主 SVN 存储库同步 当与主存储库同步时 如果可以维护单独的签
  • 如何使用SVN、Branch?标签?树干? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在谷歌上搜索了一下 找不到一个好的 初学者 指南SVN http en wikipedia org wiki Subversion
  • Subversion (svn + tortoiseSvn) 提交未锁定文件

    我经历过颠覆的奇怪功能 我们使用最新的 1 6 Svn 服务器 Visualsvn 和 tortoisesvn 1 6 6 我们已经为文件定义了属性 svn needs lock 那么如果您从不同位置复制文件 它会显示本地更改 如果您尝试提
  • wso2 svn 更新 - E205011:处理一个或多个外部定义时发生故障

    我在尝试着svn update4 0 0平台分支 却屡次碰到错误 E205011 Failure occurred processing one or more externals definitions My svn info outpu
  • 将 trunk 合并到 SVN 中的功能分支时,如何避免出现大量 svn:mergeInfo

    我试图通过将主干合并到分支中来保持功能分支最新 问题是 创建分支时存在的大约 2000 个文件 并且在分支和主干上都保持不变 除了 svn mergeinfo 之外什么都没有更新 该项目规模相当大 对我们的 SVN 历史记录的影响如此之大
  • 嵌套 svn 存储库

    我在存储库中有一个 项目 A 但在该项目中 我使用了一个托管在 Google Code 上的库 我的问题是 有什么办法可以让该库文件 挂钩 到 Google Code SVN 同时将我的项目放在我的存储库中 它是该库的父级 这样我就可以在决
  • 由于 poms 中的版本发生更改,合并来自 Maven 发布分支的更改会产生冲突

    按照标准实践 我有一个用于功能开发的 svn 主干 以及一个用于构建版本的分叉分支 该分支是使用 maven 发布插件创建的 该插件也用于创建发布 碰巧的是 偶尔的错误将在分支上修复 并且这些更改需要合并回主干 为了不错过任何更改 我希望能
  • 在 Subversion 中合并分支时预防冲突

    我最近在 Subversion 中观察到一个非常奇怪的合并冲突 我使用乌龟SVN作为客户端 干线和分行详细信息请参见以下信息 树干 两个用户正在研究这个问题 QA 是主干合并将发生的分支 为了简单起见 trunk ClassLibrary1
  • virtualenv、python 和 subversion

    我正在尝试在 python subversion SWIG 库中使用virtualenv no site packages环境 我怎样才能做到这一点 你可以从 svn 将其安装在 virtualenv 中 source home you v
  • SVN存储库内容

    我已经设置了 VisualSvn Server 创建了一个存储库 并使用 AnkhSVN 向其中添加了 Visual Studio 解决方案 存储库的 url 类似于https msi pc svn MyProj 由于我的无能 一个问题 此
  • TortoiseGit 与 TortoiseSVN 并存?

    我已经使用 TortoiseSVN 好几年了 但我正在考虑慢慢改用 git 因为我真的很喜欢它的分支和合并 我目前正在通过命令行使用 git 但正在考虑安装 TortoiseGit 有人有并排使用两只乌龟的经验吗 这有什么已知的问题吗 我真

随机推荐

  • 图书馆管理系统

    图书馆管理系统实验 1 新建project 点击OK后工程如下 项目的组织方式 需要被多个文件用到的变量声明 类的声明和函数声明放在头文件里 声明可以存放在多个不同的文件里 这些文件使用 include h 来包含这些头文件 而这些变量的定
  • CentOS5.8 Bind9 DNS企业案例

    最近研究DNS主从服务 也是参考了很多文章 这里记录一下 方便大家少走弯路 DNS服务可以算是Linux服务中比较难的一个了 尤其是配置文件书写 少一个字符都有可能造成错误 那什么是DNS呢 简单的说就是完成域名到IP的解析过程 简洁的域名
  • html增加状态信息管理代码,求大神看看使用JavaScript操作DOM的html代码,点了增加没反应...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼http www mldnjava cn MLDN高端Java培训 function addrow var tab document getElementById mytab 取得table的节点
  • Component “xxx“ does not have a method “xxx“ to handle event “xxx“

    小程序遇到这种情况说不定是把调用的方法放到了methods里面 这种情况可以把方法放到的methods外面 和methods以及data同级就可以找到了 change function e this setData hideContent
  • c语言程序项目,C语言程序设计项目教程--详细介绍

    基 础 篇 项目1 通讯录信息输出 3 1 1 学习情境 3 1 2 项目分析 3 1 3 项目目标 4 1 4 项目实现 4 1 5 相关知识 8 1 5 1 C语言基础 数据类型 常量 变量 8 1 5 2 C程序的结构特点 10 1
  • 在Android Studio中下载Android SDK的两种方式(第二种好用)

    转自 https www cnblogs com mxj961116 p 10423479 html Android studio下载地址 http www android studio org 方式一 设置HTTP Proxy1 打开Se
  • synchronized 关键字和 volatile 关键字的区别

    synchronized 关键字和 volatile 关键字是两个互补的存在 而不是对立的存在 两者主要有一下区别 1 volatile 关键字是线程同步的轻量级实现 所以 volatile性能肯定比synchronized关键字要好 2
  • Spring3.0带来的新特性

    一 首先 模块的组织更加的细致 从那么多的jar分包就看的出来 Spring的构建系统以及依赖管理使用的是Apache Ivy 从源码包看出 也使用了Maven Maven确实是个好东西 好处不再多言 以后希望能进一步用好它 二 新特性如下
  • Response.Redirect和Server.Transfer的比较

    Response Redirect响应重定向方法 Response将url返回给客户端浏览器 客户端浏览器向服务器发送重定向请求 服务器接到请求后将响应头部返回给客户端 客户端收到响应头部后发送一个新的重定向请求给服务器 Server Tr
  • 端口号被占用,如何终止?

    目录 1 使用快捷键Windows R 输入cmd进入dos命令窗口 2 输入netstat nao 查看本地所有的端口号信息 3 然后在输入 taskkill pid 数字代号 f 4 回车即可 将数字代号所对应的端口号给结束 5 数字代
  • 五、webpack的基本使用,防止重复,入口文件,懒加载,预获取/预加载(Mhua)

    入口文件 webpack 打包文件时 可以拆分多个入口文件 首先安装 lodash 插件 npm install lodash 在入口文件 index js 配置如下内容 import imgSrc from assets 2 png im
  • 【Ensemble Learning】第 4 章:混合组合

    在前面的章节中 我们讨论了如何混合训练数据 以及如何混合机器学习模型来创建更强大的模型 利用集成学习的力量 让我们继续这个学习过程 在本章中 我们介绍并解释了两种强大的集成学习技术 它们利用机器学习模型的混合组合来构建更强大的模型 我们一次
  • 在windows 上安装 openSSH

    一 基础环境 操作系统 Microsoft Windows Server 2019 datacenter 64位 openSSH 版本 OpenSSH for Windows 8 6p1 LibreSSL 3 3 3 二 操作步骤 1 下载
  • python语言turtle库画图代码示例_5分钟轻松搞定,Python开发之turtle库的基本操作...

    文源网络 仅供学习之用 如有侵权请联系删除 基础总结 turtle库是python标准库之一 入门级绘图库 import turtle之后即可使用 turtle绘图原理 有一只海龟 其实在窗体正中心 在画布上游 走过的轨迹形成了绘制的图形
  • R及RStudio下载安装教程(超详细)

    R 语言是为数学研究工作者设计的一种数学编程语言 主要用于统计分析 绘图 数据挖掘 如果你是一个计算机程序的初学者并且急切地想了解计算机的通用编程 R 语言不是一个很理想的选择 可以选择 Python C 或 Java R 语言与 C 语言
  • 模板的类型萃取

    初次接触类型萃取是在运用模板实现seqlist的时候 拷贝构造和赋值运算符重载时 单纯的使用memcopy 函数进行拷贝 只是单纯的进行了浅拷贝 对于基本的数据类型是不会有任何错误的 但是如果是string类型时 单纯的值拷贝显然是不行的
  • AttributeError: ‘xxx‘ object has no attribute ‘__bases__‘ 问题解决

    问题描述 这是我的代码 本体为一个pytorch模型 希望通过查看父类继承确定是否为网络模型 class Net nn Module def init self super Net self init self conv1 nn Conv2
  • STM32F103XX扫描I2C从机地址main.c(改进版)

    include stm32f10x h include Delay h include OLED h include MyI2C h uint8 t i 0x00 Addr Count 0 int main void OLED Init M
  • 人人组队与人机组队的风险

    无论人与人之间还是人与机之间 只要有协同就会有风险 其原因主要是 协同可能导致合作伙伴之间的利益冲突 协同合作还可能引发信息共享的风险 协同可能面临合作对象的信任问题 协同合作还可能受到外部环境的影响等等 人人组队的风险主要涉及以下几个方面
  • 开发svn hook阻止svn仓库特定分支的commit log中不包含关键字的提交

    使用批处理脚本实现开发svn hook pre commit 阻止svn仓库特定分支的commit log中不包含关键字的提交 批处理脚本 shell脚本实现 实现逻辑 1 使用svnlook 的dirs changed子命令去获取当前仓库