【问题标题】:SVN hook and Windows batch script, whats wrong?SVN 钩子和 Windows 批处理脚本,怎么了?
【发布时间】:2012-02-04 04:08:24
【问题描述】:

我想使用 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。怎么了?

谢谢:)

【问题讨论】:

  • for /? 说“默认情况下,/F 从每个文件的每一行传递第一个空格分隔的标记。”。你可以告诉/F 使用第二个令牌,如果你能保证它总是第二个 - 我不记得 svnlook 输出,但你不能保证 svn update 输出。你能让 svnlook 只返回文件名而不返回状态字符吗?
  • 让我们看看,至少 usebackq tokens=2 只返回我的名字。当我以新方式运行它时, svn update 说它正在跳过文件......奇怪。你还能看到其他可能有问题的地方吗?
  • 我想通了!我需要完整的路径!所以我添加了 SET MYPATH=d:\apache\htdocs 并在 svn update 前面添加了这个!
  • 'Skipped XYZ' 表示 1) 我们不在工作副本中 2) 路径 XYZ 处没有工作副本。你确定更新正确的地方吗?是否需要先pushd c:\the_working_copy,最后再popd
  • 见上文!你让我走上正轨,谢谢! 已解决

标签: svn batch-file post-commit-hook


【解决方案1】:

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

你不太清楚你想做什么。

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

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

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

几种处理方法:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多