2

我有一个 SVN 存储库

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

在服务器上,我有一个/var/www/trunk由 user 拥有的 trunk ( )的工作副本结账www-data

fileR.txt对除用户之外的所有人都是只读的www-data(访问由authz或限制svnlook author)。fileR.txt应该通过连接file1.txt和生成file2.txtcat file1.txt file2.txt > fileR.txt

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

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

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

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

谢谢

4

1 回答 1

1

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

  1. 我在 file1.txt 中进行了更改。
  2. 提交后挂钩获取更改,并创建一个新文件 fileR.txt
  3. 提交后更改提交此更改,这会导致您的预提交挂钩触发。
  4. 而且,你马上回到第 1 步

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

而且,当你的 post-commit 钩子在做所有这些时,你的用户必须等待 post-commit 钩子完成。

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

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


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

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

于 2011-12-11T03:32:34.743 回答