svn hook 从提交的文件生成文件

Posted

技术标签:

【中文标题】svn hook 从提交的文件生成文件【英文标题】:svn hook to generate file from committed files 【发布时间】:2011-12-11 00:23:49 【问题描述】:

我有一个 SVN 存储库,其中包含

trunk/file1.txt
trunk/file2.txt
trunk/fileR.txt

在服务器上,我有一个用户 www-data 拥有的主干 (/var/www/trunk) 的工作副本检出。

fileR.txt 对除用户 www-data 以外的所有人都是只读的(访问权限受 authzsvnlook author 限制)。 fileR.txt 应该通过连接file1.txtfile2.txt 生成:cat file1.txt file2.txt > fileR.txt

我想要的是,每次在 trunk/file1.txttrunk/file2.txt 上提交时,都应该运行一个脚本来更新服务器上的工作副本,连接文件并将新的 fileR.txt 提交到存储库。

我想到的是一个提交后挂钩,它可以完成上述所有操作,但我不确定 SVN 是否以及如何处理新提交,直到上一次提交完成。

示例:因此,commit1 对file1.txt 进行了更改,预提交挂钩运行(如果有),事务提交到数据库,然后提交后挂钩运行。 post-commit 钩子实际上创建了一个 commit2,它需要在来自 commit1 的 post-commit 钩子实际完成之前完成。

SVN 有能力做到这一点吗?如果没有,您建议使用哪些其他工具/工作流程?

谢谢

【问题讨论】:

通常情况下,如果一个文件可以从存储库中的其他文件派生,您根本不会将该文件提交到存储库。任何需要该/那些文件的人都可以按需派生。为什么需要将fileR文件存储在存储库中,而您可以简单地连接其他两个来获取它? 一个问题:为什么fileR需要存在?用户不能分别使用 file1 和 file2 吗?我认为需要更多的上下文来弄清楚你为什么要这样做——这对我来说似乎很奇怪。 fileR 出于遗留原因需要存在。在我们的研究小组中,我们使用 BibTeX 来生成我们论文中的所有参考文献(这是 fileR)。最近,我们意识到将fileR 与我们发表的论文和其他人发表的论文一起保存并不是一个好主意,并切换到两个单独的文件(一个给我们,一个给世界其他地方)。不幸的是,我们使用一些脚本为研究组中的个人自动生成出版物列表(我不想更改)。但我们仍然希望保留旧文件。 【参考方案1】:

假设你做了一个提交后挂钩来做你想做的事......

    我在 file1.txt 中提交了更改。 Post-commit 挂钩获取更改,并创建一个新文件 fileR.txt 提交后更改会提交此更改,从而触发您的预提交挂钩。 而且,您马上回到第 1 步

还有一个问题是在您的服务器上创建一个工作副本,您的 post commit hook 可以在其中运行。当有人进行提交时,您必须更新甚至签出服务器上的工作副本,连接更改,然后在不触发提交挂钩的情况下进行新的提交。请记住,人们可能会创建分支,因此您可能必须拥有多个工作副本。

而且,当您的 post-commit 挂钩执行所有这些操作时,您的用户必须等待 post-commit 挂钩完成。

另外,如果我进行提交,我的工作副本现在已经过时了。我现在必须提交,然后进行更新,因为服务器进行了提交。

我希望我已经让你相信这不是一个好主意。这可能的,但它肯定是不可取的。事实上,如果我看到一个构建工程师做这样的事情,我会解雇他们。


我建议你看看Jenkins。 Jenkins 是一个持续构建服务器。您可以做的是让 Jenkins 在提交完成时为您创建 fileR.txt 文件。该文件可以很容易地从 Jenkins 服务器下载并公开发布。您也可以使用您的 fileR.txt 并为人们创建 PDF。

因此,您的组合文件仍然可用,并且可以由您的其他进程下载,但不会导致您的提交后挂钩触发另一轮挂钩。而且,fileR.txt 只有有权访问该特定 Jenkins 作业的每个人才能读取。

【讨论】:

感谢您的回答和指点。我会试试你提到的东西。

以上是关于svn hook 从提交的文件生成文件的主要内容,如果未能解决你的问题,请参考以下文章

svn提交后利用hooks自动更新web服务器

windows下svn钩子实现每次提交更新至web目录

SVN提交后自动同步到web服务器hooks的使用

svn命令 行如何把已经删除的文件提交上去?

SVN提交以后出现出现post-commit hook failed 是啥原因?

如何设置SVN提交时强制添加注释