每当有人提交到 SVN 存储库时,我想对代码应用一些样式,为此我使用astyle
svn 钩子对提交的更改使用pre-commit
。
我可以获取这样的文件名,但是当我应用 astyle 时,程序似乎无法从文件中获取数据:
for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | cut -b 5-); do
# echo $REPOS/$FILE 1>&2 # prints the files' paths
astyle --style=gnu -n $FILE
done
# commit the changes from astyle here
知道我怎样才能实现这个目标吗?
答案1
恐怕,但我有一个坏消息要告诉你:你做不到
正如中提到的SVN-图书在“实现存储库挂钩”一章中,在带有 Stop-Sign 的评论中(你知道,那它的意思是)
虽然钩子脚本几乎可以做任何事情,但钩子脚本作者应该在一个方面表现出克制:不要使用钩子脚本修改提交事务。虽然使用挂钩脚本来自动纠正正在提交的文件中存在的错误、缺陷或策略违规可能很诱人,但这样做可能会导致问题。 Subversion 保留存储库数据某些位的客户端缓存,如果您以这种方式更改提交事务,这些缓存就会变得难以察觉的陈旧状态。这种不一致可能会导致令人惊讶和意外的行为。您应该简单地在预提交挂钩中验证事务,并在不满足所需要求时拒绝提交,而不是修改事务。作为奖励,您的用户将了解谨慎、合规的工作习惯的价值。
CollabNet 首席技术官 Jack Repenning 也表示提到这
...遗憾的是我必须告诉你,不,你不能那样做。正在提交的文件的文件内容是您可以在钩子脚本中使用(通过 svnlook 的“changed”和“cat”命令),但是您看到的是已经输入到数据库中的数据的副本(尽管尚未实际提交),并且您没有可以修改它,仅允许或拒绝最终事务提交。
如果你仍然勇敢尝试,你可以尝试从而不是理解代码老话题(2009 年),作者声称“它修改交易内容”