1

我们有一个 SVN 控制下的 PHP 项目(VisualSVN)。

不知何故,我需要用当前的修订号更新 repo 中的文件。这样当主站点更新/结帐时,我们可以显示 svn 内部版本号(这部分不是问题)。

是否可以使用 pre/post-commit-hook 来做到这一点?

4

4 回答 4

2

pre and post-commit-hooks behave differently (see the documentation in the SVN red book about the hooks and especially the part about implementing the hooks):

  • pre-commit: Check if the commit is allowed. So the pre-commit hook is not able at all to change anything inside the commit.
  • post-commit: Notifies about a successful commit.

So no mention of the chance to change anything. Instead, there is a paragraph in the section "implementing the hooks":

While hook scripts can do almost anything, there is one dimension in which hook script authors should show restraint: do not modify a commit transaction using hook scripts. While it might be tempting to use hook scripts to automatically correct errors, shortcomings, or policy violations present in the files being committed, doing so can cause problems. Subversion keeps client-side caches of certain bits of repository data, and if you change a commit transaction in this way, those caches become indetectably stale. This inconsistency can lead to surprising and unexpected behavior. Instead of modifying the transaction, you should simply validate the transaction in the pre-commit hook and reject the commit if it does not meet the desired requirements. As a bonus, your users will learn the value of careful, compliance-minded work habits.

So I would say, it is not possible or at least recommended to do that.

于 2012-03-28T06:25:15.133 回答
2

听起来您需要构建解决方案,而不是预提交挂钩。使用 Apache Ant 之类的构建系统,您可以在为实时环境准备解决方案时从存储库中获取最新的修订号。

编辑:要实际回答您的问题“是否可以使用 pre/post-commit-hook 来做到这一点?” 是的,这在技术上是可行的,但正如已经建议的那样,应该避免。

于 2012-05-29T03:12:07.743 回答
0

要求开发人员自己更新文件,然后使用预提交脚本拒绝更新不正确的提交怎么办?也许插入修订号是更好地纳入编辑器或构建过程/部署脚本的责任。

于 2012-03-28T11:50:24.137 回答
0

虽然 mliebelt 引用了正确的文本,但他得出了错误的结论。甚至两次:

  • 它必须在提交后挂钩中完成
  • 挂钩是不可能的

第二个声明

如果 post-commit 钩子将重写未包含在此提交中的文件,这将是完全有效的操作,不会破坏任何内容。

第一个声明

由于很多原因,这个解决方案显然很糟糕:

  • 您在存储库中包含(以便稍后参考)数据,这取决于整个存储库数据更改,但是:此文件中数据的每次更改也会更改存储库数据的状态。经典恶性循环
  • 您两次增加所需的修订量:每次“数据修订”后,您必须执行“跟踪修订”
  • 您希望 VCS 参与解决其他问题,更适用于构建部署工具,因为 VCS拥有这些数据就足够了

存储库(或工作副本)本身包含有关上次修订的信息(svn info, svnversion, svn log -r HEAD),将其存储在数据中违反了 Occam 的 Raroz。当您“发布”数据以使用外部存储库时,您只有提取数据。

哪些工具以及如何使用很大程度上取决于:部署工作流程、操作系统(您没有在普通 Win-box 上使用 gawk-grep-sed),只是一些提示:

  • TortoiseSVN 的 SubWCRev(仅限 Win)可以通过用实际值替换特殊的 SubWCRev 关键字来检查工作副本和处理模板文件。SubWCRev 有姐妹的 Linux 世界项目。使用这些工具假定将模板文件存储在某处(内部或外部存储库)并将处理结果保存在准备使用的项目树中
  • svnversion 和 svnlook 可以在任何操作系统中使用(相应地用于 WC-path 和 repository-path)

最后

  • 可以使用 Subversion 关键字在 repo中存储修订号,只是不要忘记,文件内部使用的 $Revision$ 反映了此文件中最后更改的修订,并且在扩展后具有预定义的格式
于 2012-03-28T10:04:15.957 回答