是否可以从post-commit hook获取文件属性?
我想检查所有已更改的文件,如果其中一个或多个具有我的特定属性,我想执行某些操作。
svn propget my:property file.txt
^这只从本地工作副本读取属性,但我没有在执行钩子的env中找到它。
谢谢!
答案 0 :(得分: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
shell的一个问题是你不能很容易地在循环中做循环。例如,如果我可以使用$SVNLOOK plist
执行某些操作会很好,但我已经将STDOUT传递给STDIN,因此svnlook plist
的任何输出都会影响我的外部循环。您可以使用各种奇怪的东西来使用其他文件描述符,但使用Python或Perl会更容易。
你也真的无法改变提交的任何内容。您无法更改文件或文件属性。您可以更改的唯一内容是修订属性,如svn:log
,甚至不建议这样做。
不确定你的想法,但要小心。还要明白,任何可能花费太长时间的事情都会延迟用户的提交,因为他们等待你的提交后脚本运行。我见过人们试图在Subversion钩子中编译和运行单元测试。在这种情况下,最好使用像Jenkins这样的连续构建系统来进行提交后处理。
您可以查看我的svn-watcher-hook,看看它是如何完成的。这是一个Perl脚本,但并不是那么复杂,我试着解释我所做的一切。这不应该太难理解。