SVN本身并不提供这种强制写log的功能,而是通过一系列的钩子程序(我们称为hook脚本),在提交之前(pre-commit),提交过程中(start-commit),提交之后(post-commit),调用预定的钩子程序来完成一些附加的功能。
本次我们要实现的是在提交到版本库之前检查用户是否已经写了注释,当然要使用pre-commit这个钩子程序。我们打开SVN的repository下的hook目录,可以发现有好几个文件,其中一个是“pre-commit.tmpl”。这个文件是一个模板文件,它告诉了我们如何实现提交前控制。打开该模板文件,我们看到如下一段说明:
# The pre-commit hook is invoked before a Subversion txn is
# committed. Subversion runs this hook by invoking a program
# (script, executable, binary, etc.) named 'pre-commit' (for which
# this file is a template), with the following ordered arguments:
#
# [1] REPOS-PATH (the path to this repository)
# [2] TXN-NAME (the name of the txn about to be committed)
#
# The default working directory for the invocation is undefined, so
# the program should set one explicitly if it cares.
#
# If the hook program exits with success, the txn is committed; but
# if it exits with failure (non-zero), the txn is aborted, no commit
# takes place, and STDERR is returned to the client. The hook
# program can use the 'svnlook' utility to help it examine the txn.
我们看到在一个提交事务执行之前,该hook脚本会被调用。然后向该脚本传递两个参数:REPOS-PATH和TXN-NAME,一个是用户要提交的URL,一个是本次事务的一个事务号。如果提交成功则返回0,否则返回其它非0结果。那么我们的钩子程序就是要在事务提交之前,拦截这些请求,然后通过svnlook命令来检查是否已经写了log。
示例代码
下面这段代码是网上直接拷贝的一段代码:
@echo off
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 10 characters
svnlook log "%REPOS%" -t "%TXN%" | findstr " ." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo Empty log message not allowed. Commit aborted! 1>&2
exit 1
下面解析一下绿色高亮处代码的作用:
① set REPOS=%1
set TXN=%2
还记得我们前面提到的但事务提交时,会传递两个参数吗?这里就是分别用来接收URL和事务号的
② svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
这句是核心程序。首先svnlook log是用来查看某个版本库某次提交的log的,那么我们怎么知道这两个
参数呢?答案就是我们前面已经保存的REPOS和TXN参数。
它的作用是查看%REPOS%这个URL第%TXN%次提交的log信息,那么| findstr ".........."呢?细心
的读者会发现这里有10个圆点号,即表示10个字符。
整句的作用就是先获取当前提交的log内容,然后判断是否有10个字符以上
③ echo Empty log message not allowed. Commit aborted! 1>&2
这句话的作用是当提交检查失败时,输出的提示信息
以下代码在Linux下亲测可行:
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" |grep "[a-zA-Z0-9]" || exit
注意:在Linux下需要将pre-commit.tmpl改正成pre-commit
并且更改运行权限:chmod +x pre-commit
在windows下需要将pre-commit.tmpl改正pre-commit.bat
相关推荐
在版本控制系统Subversion(简称...总的来说,通过编写和配置svn钩子脚本,可以实现svn强制写日志的需求,而修改日志功能则需要借助额外的工具或服务。确保团队遵循良好的日志习惯,可以显著提高代码管理的质量和效率。
本文将深入探讨“svn强制写日志hooks”这一主题,它与Subversion的钩子脚本(hooks)密切相关,这些脚本允许在执行特定操作时执行自定义的服务器端逻辑,例如提交日志消息。 首先,了解“hooks”在svn中的作用至关...
首先,让我们关注强制写日志的钩子。在svn的版本库hooks目录下,有一个名为`pre-commit.tmpl`的模板文件,我们需要复制它并重命名为`pre-commit.bat`。这个脚本会在用户尝试提交变更前运行。通过修改`pre-commit.bat...
### SVN限制强制写日志及只能修改自己日志脚本 #### 1. SVN客户端修改日志功能(且只能修改自己日志) 在Windows环境下,为了实现SVN客户端的修改日志功能,并确保用户只能修改自己的日志记录,可以通过自定义...
在本案例中,我们需要创建一个预提交(pre-commit)钩子脚本来实现两个功能:禁止除特定用户外的所有人删除文件,并且强制所有提交必须包含至少10个字符的注释。 首先,我们来理解一下这个`pre-commit.bat`钩子脚本...
- `log-encoding`:日志消息的编码格式。 `servers`文件中,`global`部分定义了通用的服务器设置,而每个 `[server]` 段落则针对特定的服务器URL。 `svnserve.conf`中的关键配置包括: - `anon-access`和`auth-...
2. **如何在svn中强制写日志信息**: Subversion提供了一种机制,即通过钩子脚本来实现这样的规则。在svn服务器的hooks目录下,有一个名为`pre-commit`的脚本,它会在提交发生前执行。通过编辑这个脚本,可以检查...
1. **设置提交前必须写日志** 在VisualSVN Server中,可以使用预提交(Pre-commit)钩子来实现这一功能。预提交钩子是在用户提交变更到版本库之前执行的脚本,如果脚本返回非零退出状态,则提交会被阻止。按照以下...
svn log svn diff 比较本地修改 比较工作拷贝和版本库 比较版本库与版本库 svn cat svn list 关于历史的最后一个词 其他有用的命令 svn cleanup svn import 摘要 4. 分支与合并 什么是分支? 使用分支 创建分支 在...
强制用户写日志 B.2.1. 服务器端的钩子脚本(Hook-script) B.2.2. 工程(Project)属性 B.3. 从版本库里更新选定的文件到本地 B.4. Roll back (Undo) revisions in the repository B.4.1. 使用版本日志对话框 B....
写日志操作的`pre-commit.bat`脚本则可能关注提交信息的质量。它可能强制要求提交者提供详尽的、符合规范的日志消息,避免提交信息为空或者过于简略。这有助于维护版本历史的可读性和可追溯性。实现方式通常是检查待...
- **查看日志**:通过`svn log`命令查看提交记录。 - **解决冲突**:当多人同时修改同一份文件时可能会出现冲突,使用`svn resolved`命令标记已解决的冲突。 #### 四、高级特性 1. **分支与合并**: - 创建分支:...
6. 文件版本查找:如果需要查看文件的历史版本,可以通过SVN客户端的相关命令追溯到特定的修订版本,并通过查看日志(Log)来获取版本变更的详细信息。 7. 常用SVN客户端软件:TortoiseSVN是Windows平台下的一款SVN...