我想 (使用 svnlook 来) 只更新那些被自动更改/添加的存储库文件等等。
你不太清楚你想做什么。
- 您是否正在运行某种...比如说...网站,并且当开发人员更改您的 Subversion 存储库中的文件时,您希望使用这些更改自动更新您的网站?
- 您是否正在查看一个目录,并且当该目录中的文件发生更改时,您希望将这些更改保存到您的 Subversion 存储库中吗?
我假设你想做#1,因为#2 不可能用 post-commit 或 pre-commit 钩子脚本来做。提交前/提交后挂钩脚本仅在有人提交时运行,因此它不能更改目录本身。
因此,您的存储库中有文件,并且在使用这些文件的某种服务器上有一个目录。当存储库发生更改时,您希望进程自动更新这些文件。
处理这种情况的几种方法:
- 在包含服务器和文件的机器上。确保包含文件的目录是 Subversion 工作目录。如果您使用 Subversion 1.7,则唯一
.svn
的目录位于工作目录的根目录中,这使事情变得更清晰和更易于管理。现在,您所需要的只是一个计划任务(Unix 术语中的 cronjob),它每五分钟触发一次……比如说……。此任务所做的只是在该工作目录上运行更新。不需要提交后挂钩。
- 你可以在你的 Subversion 服务器上有一个工作目录,它可以被 post-commit 钩子脚本访问。当提交发生时,post-commit 挂钩会更新该工作目录,然后对您拥有这些文件的服务器上的目录执行rsync 。rsync只会复制已更改的文件,因此比复制整个目录内容要快。问题是,在每次提交之后,进行提交的用户必须等待 post-commit 钩子更新该工作目录和 rsync,然后才能执行其他任何操作。
- 更好的方法是使用像Jenkins这样的持续集成工具,在有人提交时自动执行您需要执行的任何操作,而不是依赖提交后挂钩。Jenkins 将记录所有内容并让您知道是否有问题。
我的偏好是#3,然后是#1。使用 post-commit 挂钩只会减慢 Subversion 的速度并让您的开发人员感到沮丧。Jenkins 易于设置和运行。他们的支持非常好,和 Subversion 一样,它是一个免费的开源工具。
您可以将 Jenkins 设置为自动让包含这些文件的服务器在提交后自动运行更新。事实上,这非常容易设置。我通常推荐以下内容:
- 您的服务器配置为使用 directory
C:\foo
。
- 更新提交,您创建一个目录
C:\bar
并执行 asvn export
创建一个没有任何目录的新.svn
目录。
- 在
svn export finishes, you rename
C:\bar to
C:\foo` 之后。您的服务器现在正在使用新目录。
这样做的好处是您的服务器在文件更新过程中不使用目录。假设有三个文件,filea.txt
,fileb.txt
和filec.txt
. fileb.txt
对和进行了更改filec.txt
。如果不同时部署这些更改(您会被解雇),这些更改将同时发生,并且将发生灾难性后果。
在更新过程中的某个时刻,fileb.txt
将处于新版本,而filec.txt
将处于旧版本。当然,在更新完成之前,您的服务器不太可能同时使用新版本fileb.txt
和旧版本,但是您愿意为此打赌吗?.filec.txt
所以,看看 Jenkins,它会在不减慢 Subversion 的情况下做你想做的事。另外,它将记录其所有操作。这样,您可以查看更改了哪些文件、更新是否成功以及在需要时轻松回滚更改的能力。此外,在您可能不希望对服务器进程进行特定更改的情况下,暂时阻止 Jenkins 进行更新要容易得多。