关于hook:如何让Subversion(SVN)在签到时发送电子邮件?

关于hook:如何让Subversion(SVN)在签到时发送电子邮件?

How do I make Subversion (SVN) send email on checkins?

我一直发现签入(提交)邮件对于跟踪其他人在代码库/存储库中所做的工作非常有用。如何设置SVN以在每次提交时通过电子邮件发送分发列表?

我正在Windows上运行客户端,在Linux上运行Apache Subversion服务器。以下各种平台的答案可能对其他人很有用。


您使用提交后挂钩。这是一个指南。

下面是一个示例Ruby脚本,该脚本在每次提交后发送电子邮件:commit-email.rb


看看独立的Subversion通知工具(仅Windows!)
它可以在提交时通过电子邮件发送邮件,并且还有更多功能!


您需要熟悉存储库挂钩,尤其是提交后的挂钩。


1)使用sudo apt-get

在svn服务器上安装svnnotify

2)使用仓库的提交后钩子(在svn网站上的提交后钩子上阅读)

3)打开提交后的挂接文件并粘贴以下代码,以使用smtp服务器发送电子邮件。
由于不需要配置sendmail,因此直接使用smtp。

4)确保在\\\\(换行符)之后没有多余的空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh

REPOS="$1"
REV="$2"
TO="xyz@yah.com" # who will receive the notifications
FROM="hello@goog.com" # what will be in"FROM" fields


 /usr/bin/svnnotify \\

--repos-path"$REPOS" \\
--revision"$REV" \\
--to $TO \\
--from $FROM \\
--reply-to $FROM \\
--smtp"YOUR.SMTP.MAIL.COM" \\
--subject-prefix"[svn commit]" \\
--attach-diff -a \\
--header 'Message generated on Subversion Check-in.' \\
--footer 'OpenSource Team. ' \\
--svnlook"/usr/local/bin/svnlook" \\
--handler HTML::ColorDiff # make diff pretty

我使用类似于此脚本的提交后脚本。

它发送了一封不错的HTML电子邮件。我对其进行了一些更新,突出显示了以红色突出显示的代码,突出显示了以蓝色添加的代码。


什么平台?

在Mac OS X上,我已安装msmtp并在存储库中的钩子下创建了提交后脚本。需要为svn(或www)用户设置一个.msmtprc文件。

1
2
3
4
5
6
7
8
9
10
11
12
REPOS="`echo $1 | sed 's/\\/{root of repository}//g'`"
REV="$2"
MSG=`/usr/local/bin/svn log -v -r HEAD https://localhost$REPOS`

/usr/local/bin/msmtp {list of recipients} <<EOF
Subject: SVN-Commit $REPOS#$REV
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8Bit

$MSG
EOF

根据您的需要设置{root of repository}{list of recipients}。请注意,我使用UTF-8是因为在瑞典(???)中有一些特殊字符。


在提交后的钩子上有一个相关的问题。就个人而言,我更喜欢向可以从中获取RSS提要的消息发送消息,因为每次提交的电子邮件会很快使我的收件箱超载。


就像其他人所说的,"什么平台"。在Windows上,我使用了" blat"(这是免费的命令行SMTP邮件程序)以及后提交和另一个批处理文件来实现的。

发布后的提交看起来像这样:(只需调用另一个批处理文件)

1
2
3
 call d:\\subversion\
epos\
ts\\hooks\\mail %1 %2

mail.bat看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
copy d:\\subversion\
epos\
TS\\hooks\\Commitmsg.txt %temp%\\commit.txt
copy d:\\subversion\
epos\
TS\\hooks\\subjbase.txt %temp%\\subject.txt
svnlook info -r %2 %1 >> %temp%\\commit.txt
echo Revision %2 >> %temp%\\commit.txt
svnlook changed -r %2 %1 >> %temp%\\commit.txt
svnlook author -r %2 %1 >> %temp%\\subject.txt
c:\\utils\\blat %temp%\\commit.txt -t <me@my.email.com> -sf %temp%\\subject.txt -server ServerName -f"SVN Admin <svn@my.email.com>" -noh2

编写SVN挂钩的最大陷阱是,您可能基本上没有环境设置-没有exe路径,没有临时路径等。尽管在最近的SVN构建中可能有所改善。


我在Linux服务器上分3个步骤完成了操作:

  • 创建一个邮件列表(svn-notify@xy.com)并将人员添加到列表中。

  • 编辑/path_to_your_svn/svn/hooks/svn-notify/mailer.conf

    • to_addr = svn-notify@xy.com
    • from_addr =%(作者)s@xy.com
    • commit_subject_prefix = [XY-SVN]
  • 将此行添加到您的/path_to_your_svn/svn/hooks/post-commit文件中:
    /path_to_your_svn/svn/hooks/svn-notify/mailer.py commit"$REPOS""$REV" /path_to_your_svn/svn/hooks/svn-notify/mailer.conf

  • 您可以使用buildbot。该工具可以在每次签到时采取任意措施。这是一个功能全面的持续集成系统,但是如果您只想发送电子邮件,那么它肯定可以解决该问题。它具有适用于包括SVN在内的各种SCM的插件。


    在特定Subversion分支的" hooks"目录中,有9个模板文件可帮助您入门。

    要点:Subversion在重命名之前不会执行任何文件。要使post-commit.tmpl在UNIX下执行,请将其重命名为" post-commit"。在Windows下,将其重命名为" post-commit.bat"或" post-commit.exe"。如果Subversion名为" post-commit.tmpl"或" post-commit.sh"或类似名称,则不会执行该文件。

    此外,请确保该文件可由运行subversion的同一用户执行。


    VisualSVN Server具有有用的提交电子邮件通知挂钩VisualSVNServerHooks.exe。它支持彩色差异,并且仅在提交影响某些存储库路径时才能发送提交通知。

    请参阅"在VisualSVN Server中配置电子邮件通知"。


    在RSS feed上第二个@Matt Miller。

    有一个有用的工具,称为WebSVN,它为每个存储库以及具有完整提交消息的各个分支/标记/文件夹提供RSS feed。它也是一个不错的Web界面,可快速查看文件历史记录和提交/差异,而无需运行更新并打开您选择的编辑器。


    还可以在Linux上使用SVNMailer。


    Subversion源代码中包含一个用Perl编写的(大型)示例(可以在此处查看)。


    检查此处描述的svn-mod-email软件包。 svn-mod-email是用于SVN电子邮件通知管理的强大工具,它以Debian归档文件的形式提供。它很容易安装,配置和使用。


    推荐阅读