1

我正在编写一个提交后挂钩,在其中我使用 svn diff -summarize 来获取更改内容的摘要。添加或修改文件/文件夹时,我可以简单地在工作副本中获取它们的文件类型,该工作副本始终自动更新。但是当删除文件或文件夹时,我无法确定 svn diff -summarize 中的项目是文件还是文件夹。

我为此想到的一种解决方法是保留另一个工作副本,自动更新,但始终将一个修订保留在另一个工作副本之后。这样,如果文件/文件夹被删除,我可以在旧的工作副本中得到它。但是,我认为这是一种非常低效的方法,迫使我同时保留两个不同的工作副本,我想知道 SVN 中是否有任何东西可以帮助完成这项任务。

4

1 回答 1

2

在编写任何类型的 svn 挂钩时,如果您需要有关存储库或事务的信息,您希望使用svnlookshell 脚本中的程序,或使用您选择的语言的 svn API。使用svnlook速度更快,因为它绕过了所有 svn RA(远程访问)代码,包括授权检查层——因为脚本是在服务器的上下文中运行的,所以这不是问题。此外,您没有额外的开销来更新您不用于文件类型信息以外的任何内容的工作副本。

svnlook包含许多用于调查修订(用于 post-* 挂钩)和事务(用于 pre-* 事务)的选项。这里特别感兴趣的是changed选项。

更改:用法:svnlook 更改了 REPOS_PATH 打印已更改的路径。 有效选项: -r [--revision] ARG : 指定修订号 ARG -t [--transaction] ARG : 指定事务名称 ARG --copy-info : 显示副本的详细信息

显示构成修订或事务的更改,如下所示:

A   trunk/src/new-dir/
A   trunk/src/new-dir/newheader.h
A   trunk/src/new-dir/newsrc.c
U   trunk/src/existingsrc.c

svnlook 的输出,当引用一个目录时,总是以 / 结尾。这是检测文件或目录的简单鉴别器。

但是,在处理删除时,事情确实变得有点模糊。如果删除目录,则该目录下的所有内容也将被删除,并且此信息不会显示在changed. 看这里:

D   trunk/src/new-dir/
U   trunk/src/existingsrc.c

根据您正在查看的内容的描述,我猜您正在寻找某种形式的提交后报告。如果是这样,您可能需要查看subversion 邮件程序 post-* hook。即使您不想通过电子邮件发送结果,代码也演示了如何使用 svn API 遍历事务或修订以进行更改。

于 2011-03-17T03:56:58.860 回答