我们有一个 SVN 控制下的 PHP 项目(VisualSVN)。
不知何故,我需要用当前的修订号更新 repo 中的文件。这样当主站点更新/结帐时,我们可以显示 svn 内部版本号(这部分不是问题)。
是否可以使用 pre/post-commit-hook 来做到这一点?
我们有一个 SVN 控制下的 PHP 项目(VisualSVN)。
不知何故,我需要用当前的修订号更新 repo 中的文件。这样当主站点更新/结帐时,我们可以显示 svn 内部版本号(这部分不是问题)。
是否可以使用 pre/post-commit-hook 来做到这一点?
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):
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.
听起来您需要构建解决方案,而不是预提交挂钩。使用 Apache Ant 之类的构建系统,您可以在为实时环境准备解决方案时从存储库中获取最新的修订号。
编辑:要实际回答您的问题“是否可以使用 pre/post-commit-hook 来做到这一点?” 是的,这在技术上是可行的,但正如已经建议的那样,应该避免。
要求开发人员自己更新文件,然后使用预提交脚本拒绝更新不正确的提交怎么办?也许插入修订号是更好地纳入编辑器或构建过程/部署脚本的责任。
虽然 mliebelt 引用了正确的文本,但他得出了错误的结论。甚至两次:
第二个声明
如果 post-commit 钩子将重写未包含在此提交中的文件,这将是完全有效的操作,不会破坏任何内容。
第一个声明
由于很多原因,这个解决方案显然很糟糕:
存储库(或工作副本)本身包含有关上次修订的信息(svn info
, svnversion
, svn log -r HEAD
),将其存储在数据中违反了 Occam 的 Raroz。当您“发布”数据以使用外部存储库时,您只有提取数据。
哪些工具以及如何使用很大程度上取决于:部署工作流程、操作系统(您没有在普通 Win-box 上使用 gawk-grep-sed),只是一些提示:
最后