从svn工作副本目录中删除已删除的内容

时间:2011-12-04 05:51:19

标签: svn

我的svn repo是/ home / httpd / svn / project。工作副本是/ home / httpd / svn / project_work。我正在运行一个更新工作副本的post-commit脚本,然后运行测试站点的rsyncs。这很好用。

但我也需要从工作副本目录中删除已删除的文件。我知道如果我目前在我的工作副本目录中,这个脚本有效:

svn status | grep'^!' | sed's /! * //'| xargs -I%svn rm%

但是我的post-script在svn / hooks目录下运行。如何告诉上面的命令对工作副本目录中的文件进行操作,以便它可以成为我的提交后脚本的一部分?

我的脚本如下所示:

$SVN update $HOST/$SITE_WORK --non-interactive --username xxxxx --password xxxx >> $LOG
$RSYNC -azv --exclude=.svn $HOST/$SITE_WORK/* /home/httpd/sites/$SITEDIR/doc-root >> $LOG

2 个答案:

答案 0 :(得分:1)

SVN服务器无法发送要在客户端上执行的命令。如果愿意,您可以在每个客户端上为别名svn运行svn和自定义脚本。

此外,当svn rm <filename> svn up时,所有客户端都会删除使用$ svn info aFile.txt Path: aFile.txt Name: aFile.txt URL: http://xp-dev.com/svn/sof/trunk/aFile.txt Repository Root: http://xp-dev.com/svn/sof Repository UUID: d3d45886-b759-4dae-a297-3c88720da0c3 Revision: 2 Node Kind: file Schedule: normal Last Changed Author: wederbrand Last Changed Rev: 2 Last Changed Date: 2011-12-05 19:53:11 +0100 (Mon, 05 Dec 2011) Text Last Updated: 2011-12-05 19:53:37 +0100 (Mon, 05 Dec 2011) Checksum: e5bc1e83330bccc8efe0e884b79a1c43 删除的文件。

从您的脚本中我看到您找到所有状态行开头!这表示您在不使用svn的情况下对工作副本进行了更改。来自manual

  

'!'
  项目丢失(例如,您在不使用svn的情况下移动或删除了它)。这个   还表示目录不完整(结帐或更新)   被打断了。)

听起来你或你的用户做错了什么。

编辑:这是关于删除文件的测试会话的记录:

我已经将存储库检出两份工作副本,它们在我的磁盘上被称为sof和sof2 在沙发上我添加了aFile.txt并提交了它。在sof2上,我刚刚查看了该文件。这就是它现在的样子:

$svn rm aFile.txt 
D         aFile.txt
$ svn commit -m'file deleted'
Deleting       trunk/aFile.txt

Committed revision 3.
$ l
<no files left in directory>
$ svn info aFile.txt
aFile.txt:  (Not a versioned resource)

现在我将在sof

上删除它
$ l
total 8
-rw-r--r--  1 raven  staff  36 Dec  5 19:53 aFile.txt
$ svn up
D    aFile.txt
Updated to revision 3.
$ l
<no files shown, it has been deleted>

然后文件消失了,现在到了sof2,我将要获得最新的更新

{{1}}

如果你得到任何其他行为,那么这些东西真的很奇怪:)

答案 1 :(得分:1)

我建议你看看Jenkins。 Jenkins是一个连续构建系统,但它也非常适合做这类任务。

我建议的与你正在做的有点不同 - 特别是如果你在谈论httpd:

  • svn export 添加到新的工作目录。这很干净,并且不包括.svn目录(尽管SVN 1.7并没有像以前版本那样在任何地方涂抹它们。)
  • 导出完成后,将旧工作目录重命名为临时名称。
  • 使用旧工作目录的名称重命名新的工作目录。
  • 删除旧的工作目录。

这将阻止您的工作目录处于不一致状态,即同一目录树中同时存在旧版本和新版本的文件。另外,这是自我恢复。如果由于某种原因旧的更新未完成,则新的构建将使所有内容再次正确。

通过使用Jenkins在检测到新的Subversion版本时执行此操作,您不再需要post-commit挂钩。问题是,当提交后挂钩正在运行时,你的用户必须坐在他们的办公桌前,等待Subversion在提交后的工作中通过nay或yea。另外,如果出现问题,您可以随时点击 rebuild 按钮重建工作目录。


以下是它的工作原理:

  • 用户提交更改。没有post-commit钩子。用户立即看到他们的变化是否良好。
  • Jenkins看到了这些更改,并在服务器上执行svn export以创建新的工作目录。
  • Jenkins检测到svn export成功,然后将旧工作目录移动到另一个名称,将新工作目录重命名为旧位置,然后(可选)删除旧工作副本。从来没有时间旧工作目录处于不一致状态。
  • Jenkins可以在发生更改时发送电子邮件。 Jenkins可能还会运行一些冒烟测试,以查看签入的代码是否良好,如果检测到问题则不进行更新。