【发布时间】:2012-04-11 16:02:41
【问题描述】:
我们有一个 SVN 控制下的 PHP 项目(VisualSVN)。
不知何故,我需要使用当前修订号更新 repo 中的文件。 这样当主站点更新/结帐时,我们可以显示 svn 内部版本号(这部分不是问题)。
是否可以使用 pre/post-commit-hook 来执行此操作?
【问题讨论】:
标签: svn visualsvn pre-commit-hook post-commit-hook
我们有一个 SVN 控制下的 PHP 项目(VisualSVN)。
不知何故,我需要使用当前修订号更新 repo 中的文件。 这样当主站点更新/结帐时,我们可以显示 svn 内部版本号(这部分不是问题)。
是否可以使用 pre/post-commit-hook 来执行此操作?
【问题讨论】:
标签: svn visualsvn pre-commit-hook post-commit-hook
听起来您需要构建解决方案,而不是预提交挂钩。使用 Apache Ant 之类的构建系统,您可以在为实时环境准备解决方案时从存储库中获取最新的修订号。
编辑:要实际回答您的问题“是否可以使用 pre/post-commit-hook 来做到这一点?”是的,这在技术上是可行的,但正如已经建议的那样,应该避免。
【讨论】:
提交前和提交后挂钩的行为不同(请参阅SVN red book 中有关挂钩的文档,尤其是有关implementing the hooks 的部分):
所以没有提到改变任何东西的机会。相反,在“实现挂钩”部分中有一段:
虽然钩子脚本几乎可以做任何事情,但只有一个维度 哪些钩子脚本作者应该表现出克制:不要修改 使用钩子脚本提交事务。虽然它可能很诱人 使用钩子脚本自动纠正错误、缺点或 正在提交的文件中存在违反政策的行为,这样做可以 造成问题。 Subversion 保留客户端缓存的某些位 存储库数据,如果您以这种方式更改提交事务, 这些缓存变得难以察觉的陈旧。这种不一致会导致 令人惊讶和意想不到的行为。而不是修改 交易,您应该简单地在 预提交钩子,如果不符合要求则拒绝提交 要求。作为奖励,您的用户将学习谨慎的价值, 合规意识的工作习惯。
所以我想说,这是不可能的,或者至少不建议这样做。
【讨论】:
虽然 mliebelt 引用了正确的文字,但他得出了错误的结论。甚至两次:
第二个陈述
如果 post-commit 钩子会重写 此提交中未包含的文件,这将是完全有效的操作,不会破坏任何内容。
第一句话
由于很多原因,这个解决方案显然很糟糕:
存储库(或工作副本)本身具有关于其中最新修订的信息(svn info、svnversion、svn log -r HEAD),将其存储在数据中违反了奥卡姆的 Raroz。当您“发布”数据以使用外部存储库时,您只有提取数据。
哪些工具以及如何使用很大程度上取决于:部署工作流程、操作系统(您没有在普通 Win-box 上使用 gawk-grep-sed),只是一些提示:
最后
【讨论】:
如果要求开发人员自己更新文件,然后使用预提交脚本拒绝更新不正确的提交,该怎么办?也许插入修订号是一种更好地纳入编辑器或构建过程/部署脚本的责任。
【讨论】: