2012-04-11 59 views
1

是否有可能从提交后钩子获取文件属性?SVN:从提交后钩子获取文件属性

我想检查所有更改的文件,如果其中一个或多个具有我的特定属性,我想执行一些操作。

svn propget my:property file.txt 

^这只从本地工作副本读取属性,但我没有它在执行挂钩的环境中。

谢谢!

回答

1

当您使用挂钩时,应该使用svnlook命令而不是svn命令。

TXN=$1 
REPOS=$2 
SVNLOOK="/usr/bin/svnlook" 

"$SVNLOOK" pget -t $TXN $REPOS my:property /path/in/repository 

你可以已经通过svnlook changed命令被改变文件的列表:

/usr/bin/svnlook changed -t $TXN 

这将为您提供与变更类型(U =更新,d =删除,M =修改,R =替换)和文件的名称。您可以使用该文件名与svnlook pget命令查看该属性。

也许是这样的:

$SVNLOOK changed -t $TXN | while read changeType fileName 
do 
    $SVNLOOK plist -t $TXN -v $REPOS $fileName 
done 

一个与外壳的一个问题是你不能做循环中循环很容易。例如,如果我可以用$SVNLOOK plist做一些事情,但是我已经将STDOUT传递给STDIN,那么将会很好,所以svnlook plist的任何输出都会影响我的外部循环。你可以做各种奇怪的东西来使用其他文件描述符,但使用Python或Perl更简单。

你也真的不能改变任何关于提交。您不能更改文件或文件属性。唯一可以更改的是像svn:log这样的修订版本,甚至不建议这样做。

不确定你在想什么,但要小心。还要明白,任何可能花费太长时间的操作都会延迟用户的提交,因为它们会等待您的提交后脚本运行。我见过有人试图在Subversion钩子中编译和运行单元测试。在这种情况下,最好使用像Jenkins这样的连续编译系统来执行提交后处理。

你可以看看我的svn-watcher-hook看看它是如何完成的。这是一个Perl脚本,但它并不复杂,我试图解释我所做的一切。它不应该太难理解。

+0

谢谢,这工作。我也会看看詹金斯,因为我已经有一些钩子动作了,添加这个可能会减慢svn – innin 2012-04-12 11:22:54