Subversion がどのように提供されるかは問題ではなく、フックはすべてサーバー上で同じように動作します。
フックはサーバーによって実行されます。したがって、フック自体に実行権限が設定されていること、および SVN サーバーを実行するユーザーが所有していることを確認する必要があります。また、フックが実行されると、環境はクリーンに削除されます。そのため、$PATH
希望どおりに設定されない場合があります。
通常、このタイプのエラーが表示される場合は、これらの問題のいずれかが原因です。私の推奨事項は、非常に単純なフックを作成することです (これは Unix/Linux バージョンです)。
#! /bin/bash
echo "The hook has executed" >&2
exit 2
このフックは失敗することが保証されています。これはあなたが望むものです。フックが失敗すると、STDERR に出力された出力がユーザーに返されます。次のように表示されます。
The post-commit hook failed with the output of "The hook has executed"
それが表示されない場合は、Subversion がフックの実行に失敗していることがわかります。これはフックの問題ではありません。上記の内容を確認してください: 実行ビットはオンになっていますか? Subversion サーバー プロセスを実行するユーザーが所有するフック (およびリポジトリ全体) です。(たとえば、通常はapache
、httpd
、またはwwwrun
Apache httpd.
の下svn+ssh
で実行しているため、GROUPの所有権がユーザーと同じグループであること、GROUPの実行権限が正しく設定されていること、すべてのユーザーのUMASK0002
が だけではなく に設定されていることを確認する必要があります0022
。
さて、あなたが望むものを見てみましょう:
今、SVNフックを作成して、すべてのコミットが直接sub.domain.tldに更新されるようにしたい
誰かが変更をコミットするたびに、特定の作業コピーを更新したいようです。pre-commit フックを使用してこれを行うことができますが、このタイプのものにはJenkinsを使用することをお勧めします。
- これにより、更新に時間がかかるコミット後のフックをスキップできます。たとえば、更新後にサーバーを再起動したい場合があります。post-commit フックが実行されている場合、他の誰もそれ以上の変更を行うことはできません。さらに、コミットを行ったユーザーは、コミット後のフックが実行されるまで待機する必要があります。全体で 20 秒から 30 秒しかかからないかもしれませんが、ポストコミット フックの実行中に 20 秒から 30 秒待たなければならないユーザーを想像してみてください。
- もう少しコントロールできるようになります。このようなことをするときはいつでも、2 つのサーバー ディレクトリがあります。最初のディレクトリは、サーバーが使用するアクティブディレクトリです。2 つ目は、単にそこに置かれて更新を取得する非アクティブディレクトリです。更新が発生すると、非アクティブなディレクトリを更新し、サーバーを再起動して 2 つのディレクトリを変更します。正式に非アクティブなディレクトリが更新を待っている間、更新された以前の非アクティブなディレクトリがサーバーによって使用されます。これにより、アクティブなサーバー ディレクトリが更新中に誰かがサーバー リクエストを送信する状況を防ぐことができます。
- これにより、さらなる拡張が可能になります。たとえば、すべてのコミットでサーバーを更新する必要はないと判断する場合があります。代わりに、サーバーは、ユーザーが Jenkins に入って要求したときにのみ更新されます。または、更新が発生したときに、いくつかのテストを実行したい場合があります。post-commit フックでは確かにそれはできませんが、Jenkins では可能です。複数のサーバーを更新したい場合があります。繰り返しますが、これは Jenkins を使用すると簡単です。