如何识别SVN diff中的项目是文件还是文件夹?

时间:2010-11-30 01:03:50

标签: svn post-commit

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

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

1 个答案:

答案 0 :(得分:2)

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

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

changed: usage: svnlook changed REPOS_PATH Print the paths that were changed. Valid options: -r [--revision] ARG : specify revision number ARG -t [--transaction] ARG : specify transaction name ARG --copy-info : show details for copies

显示构成修订或交易的更改,如下所示:

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

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

相关问题