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
以外的所有人都是只读的(访问权限受 authz
或 svnlook author
限制)。 fileR.txt
应该通过连接file1.txt
和file2.txt
生成:cat file1.txt file2.txt > fileR.txt
我想要的是,每次在 trunk/file1.txt
或 trunk/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 从提交的文件生成文件的主要内容,如果未能解决你的问题,请参考以下文章