1

我想使用 svnlook 只更新那些被自动更改/添加的存储库文件等等。我的存储库中有几个应用程序,所有应用程序都可能更改了文件。运行svnlook changed pathtomyrep给我文件,这是第一步。如何在批处理文件中使用它来仅更新提交挂钩中更改的文件?我有这个批处理文件(post-commit.bat):

@ECHO OFF
SET REPOS=%1
SET REV=%2
SET CHANGES=svnlook changed %REPOS% -r %REV% 
FOR /F "usebackq" %%a IN (`%CHANGES%`) DO (svn update %%a)

但是什么也没发生,代码没有更新!我知道该文件通常有效,当我输入其他内容时,它会执行。在本地测试它,而不是U 文件名我只得到U。怎么了?

谢谢 :)

4

1 回答 1

1

我想 (使用 svnlook 来) 只更新那些被自动更改/添加的存储库文件等等。

你不太清楚你想做什么。

  1. 您是否正在运行某种...比如说...网站,并且当开发人员更改您的 Subversion 存储库中的文件时,您希望使用这些更改自动更新您的网站?
  2. 您是否正在查看一个目录,并且当该目录中的文件发生更改时,您希望将这些更改保存到您的 Subversion 存储库中吗?

我假设你想做#1,因为#2 不可能用 post-commit 或 pre-commit 钩子脚本来做。提交前/提交后挂钩脚本仅在有人提交时运行,因此它不能更改目录本身。

因此,您的存储库中有文件,并且在使用这些文件的某种服务器上有一个目录。当存储库发生更改时,您希望进程自动更新这些文件。

处理这种情况的几种方法:

  1. 在包含服务器和文件的机器上。确保包含文件的目录是 Subversion 工作目录。如果您使用 Subversion 1.7,则唯一.svn的目录位于工作目录的根目录中,这使事情变得更清晰和更易于管理。现在,您所需要的只是一个计划任务(Unix 术语中的 cronjob),它每五分钟触发一次……比如说……。此任务所做的只是在该工作目录上运行更新。不需要提交后挂钩。
  2. 你可以在你的 Subversion 服务器上有一个工作目录,它可以被 post-commit 钩子脚本访问。当提交发生时,post-commit 挂钩会更新该工作目录,然后对您拥有这些文件的服务器上的目录执行rsync 。rsync只会复制已更改的文件,因此比复制整个目录内容要快。问题是,在每次提交之后,进行提交的用户必须等待 post-commit 钩子更新该工作目录和 rsync,然后才能执行其他任何操作。
  3. 更好的方法是使用像Jenkins这样的持续集成工具,在有人提交时自动执行您需要执行的任何操作,而不是依赖提交后挂钩。Jenkins 将记录所有内容并让您知道是否有问题。

我的偏好是#3,然后是#1。使用 post-commit 挂钩只会减慢 Subversion 的速度并让您的开发人员感到沮丧。Jenkins 易于设置和运行。他们的支持非常好,和 Subversion 一样,它是一个免费的开源工具。

您可以将 Jenkins 设置为自动让包含这些文件的服务器在提交后自动运行更新。事实上,这非常容易设置。我通常推荐以下内容:

  1. 您的服务器配置为使用 directory C:\foo
  2. 更新提交,您创建一个目录C:\bar并执行 asvn export创建一个没有任何目录的新.svn目录。
  3. svn export finishes, you renameC:\bar toC:\foo` 之后。您的服务器现在正在使用新目录。

这样做的好处是您的服务器在文件更新过程中不使用目录。假设有三个文件,filea.txt,fileb.txtfilec.txt. fileb.txt对和进行了更改filec.txt。如果不同时部署这些更改(您会被解雇),这些更改将同时发生,并且将发生灾难性后果。

在更新过程中的某个时刻,fileb.txt将处于新版本,而filec.txt将处于旧版本。当然,在更新完成之前,您的服务器不太可能同时使用新版本fileb.txt和旧版本,但是您愿意为此打赌吗?.filec.txt

所以,看看 Jenkins,它会在不减慢 Subversion 的情况下做你想做的事。另外,它将记录其所有操作。这样,您可以查看更改了哪些文件、更新是否成功以及在需要时轻松回滚更改的能力。此外,在您可能不希望对服务器进程进行特定更改的情况下,暂时阻止 Jenkins 进行更新要容易得多。

于 2012-01-06T16:19:42.743 回答