2012-03-19 73 views
0

我想为svn编写一个post commit钩子脚本来将仓库导出到团队基础服务器。 (所以当你提交代码时,代码的最新版本会被复制到团队基础仓库中)如何编写一个svn钩子脚本

我使用的语言只有C++和C,我从来没有写过脚本。有人能给我一步一步的指导吗?使用哪种语言,读什么等......以及一些示例代码可能?

是否可以使用C++编写钩子脚本?或者我应该学习如何使用Python或Ruby等。

+1

首先,[答案已经可以在这里(http://stackoverflow.com/questions/139315 /可-i的运行-A-脚本时-I-提交到颠覆)。其次:不。它不一定是一个“脚本”。任何与可执行位的作品。你也可以用C或C++编写钩子。 – 2012-03-19 16:16:39

回答

5

如果您愿意,可以使用C或C++编写钩子。大多数人使用Perl或Python。

最主要的是svnlook应该用在你的钩子脚本中而不是svn。 svnlook比svn更快更安全。事实上,在预提交脚本中,由于您没有存储库修订版,您必须使用svnlook

这里有一些事情要记住你的post-commit钩:

  • 你不能改变一个版本,不要试图提交更改。你的提交后挂钩最终会自行调用。如果您希望开发人员遵循某些参数,那么您需要有一个pre-commit挂钩,如果开发人员做得不对,它会失败。
  • 当Subversion调用您的post-commit挂钩时,PATH环境变量已被删除。如果您需要访问其他命令或文件,则必须自行提供完整路径。
  • Subversion会通过您的命令行传递某些参数。不是实际的命令行,但它意味着您可以在ARGV中找到这些参数。两个参数将传递给您:
    1. 服务器上的存储库路径(对于svnlook命令)。
    2. 修订版本库。

一切你必须推断虽然svnlook(你可以通过system命令来运行。但是,因为你实际编写C和C++的东西,你也许可以使用内置的Subversion API )。

另一种可能性:使用像Jenkins这样的连续构建系统来为你做脏活。您可能会发现通过Jenkins工作起来更容易,而不必担心后提交挂钩如何完成此任务。 Jenkins的优点之一是,当事情出错时,您不会将失败的提交后消息发回给用户(可能没有错)。相反,您可以对发生的事情进行完整记录,并提醒可以真正解决问题的人员。

这是我写的Perl的一个sample of one。不知道它会对你有什么好处。

+0

我们正在考虑使用Jenkins或Team Foundation服务器,如果我们使用团队基础服务器,我们需要同步svn和TFS,这就是为什么我正在考虑post-commit hook。有没有一种方法可以为团队基础服务器(svn - 团队基础服务器)使用同步功能?并感谢您的深刻回复 – kiki 2012-03-19 17:32:06

+0

@kiki - 实际上,您可以使用Jenkins来完成更多的任务,有时甚至不会将它用于构建。我只是想在这种情况下使用Jenkins只是为了在Subversion和TeamFoundation之间进行同步。 – 2012-03-19 18:02:41

1

你可以找到关于如何定义这里pre-commit钩子说明: http://wordaligned.org/articles/a-subversion-pre-commit-hook

的承诺后是类似的指令创建。

将提交后的模板复制到新文件后,您可以简单地添加一行来调用您用C++编写的程序,并将参数传递给您的程序。

这取决于您的工作,但大多数情况下使用脚本语言作为shell脚本或python来完成您的工作可以节省更多的时间。

+0

是否存在将结果导出到其他位置或将代码复制到其他位置(备份)的现有提交后挂钩? – kiki 2012-03-19 16:52:47

+0

是的,在svn源代码中有一个模板:http://svn.apache.org/repos/asf/continuum/trunk/continuum-release/src/test/scm/hooks/post-commit.tmpl现在你有版本库和版本,你可以简单地调用'svn'来获得你需要的所有提交信息。 – devsnd 2012-03-19 16:54:40

+0

我想我需要实际编写脚本的帮助。有没有我可以阅读或看的好资源?用小例子来尝试它并获得它的感觉? – kiki 2012-03-19 17:11:45