1

mycommandSVN サブディレクトリへのコミットが行われるたびに、SVN サーバーが特定のコマンドを実行するようにしsvn-rep/myfolderます。

どうすればいいですか?フックがプリインストールされたフックディレクトリがあることは知っています。しかし、そこからカスタム フックを作成するにはどうすればよいでしょうか。SVNはどのフックをいつ呼び出すかをどのように知っていますか?ファイル名に基づいていますか? また、コミットによっていくつかのファイルが変更された場合にのみフックが実行されるように制限するにはどうすればよいsvn-rep/myfolderですか?

明確にするために: コマンドは決して変更されません。サーバー上のどこかにある別のスクリプトを参照するだけです。

編集:私は実装post-commitしたばかりで、テスト目的で、SVNディレクトリのリビジョン番号を既存のものに追加する必要があります(そして誰でも書き込み可能です):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from subprocess import Popen, PIPE

dirRevisionCmd  = 'svn info /var/www/main | grep -i "Letzte geänderte Rev"

process = Popen(headRevisionCmd, shell=True, stdout=PIPE, stderr=PIPE)
out, err = process.communicate()

with open("/var/lib/svn/rep/hooks/testfile", "a") as testfile:
    testfile.write("err:" + err.strip() + "\n")
    testfile.write("out:" + out.strip() + "\n")

これにより、各コミット後に空の標準出力が生成されます。

www-data
err:
out:

手で実行するとpost-commit、「out」行にテキストが含まれます。では、なぜ SVN で動作しないのでしょうか?

4

1 に答える 1

6

サーバー上の Subversion リポジトリ内には、 というディレクトリがありますhooks。内部にはサンプルフック スクリプトがあります。それらはすべて.tmpl接尾辞で終わります。彼らは本当にプレースホルダーです。それ以上のことはありません。

という名前のプログラムまたはスクリプトがある場合post-commit、Subversion は誰かがコミットした後にそれを実行します。これが実行可能ファイル、Windows バッチ プログラム、または Unix シェル スクリプトであるかどうかは問題ではありません。Subversion は、コミットが発生した後にそれを実行します。スクリプトが何をするかは問題ではありません。それは本当に簡単です。

と呼ばれるプログラムが既にある場合はどうなりpost-commitますか? 変更する必要があります。前述したように、デフォルトのリポジトリにはフックはありません。必要に応じて使用できる一連のテンプレートだけです。プログラムがある場合は、post-commit誰かが既に追加している必要があります。

したがって、コマンドをhooksディレクトリに配置し、実行可能であることを確認して、それを呼び出しますpost-hook。誰かがコミットした後、Subversion はそれを実行します。


実行したいこのコマンドが何であるかを指定していないため、これ以上のアドバイスはできません。ただし、一般的にスクリプトをフックするためのガイドラインがいくつかあります。

  1. フック スクリプトの実行に数ミリ秒以上かかることはありません。フック スクリプトが実行されると、フック スクリプトが終了するまでコミッターのマシンが拘束されます。たとえば、よくある質問は、ポストコミット スクリプトを使用してデプロイを行う方法です。これは、コミッターのコンピューターを長時間拘束することになるため、悪い考えです。これを行うためのより良い方法があります。
  2. フック スクリプトはサーバー上で実行され、コミットはクライアント マシン上で行われました。これの意味は:
    1. フック スクリプトは、クライアントの環境にアクセスできません。
    2. フック スクリプトはクライアントにクエリを実行できません。
    3. フック スクリプトはコミットを変更できません。
    4. フック スクリプトは、クライアントの作業ディレクトリを検索できません。
      • また、コミット前のフックは、コミットを受け入れるか拒否する以外は何もできないことも意味します。
    5. フック スクリプトが新しいコミットを引き起こすべきではありません。まず、コミット フックが原因でコミットがループ内で再度実行されるという問題があります。第二に、コミットしたばかりの人が古い作業ディレクトリを持つようになります。さらに、ログ履歴の 50% は、自分自身へのコミット フックのせせらぎに過ぎないことを意味します。
  3. 最後に、フック スクリプトには、クライアントと対話するための非常に簡単な方法があります。
    1. STDINフック スクリプトは、クライアントのまたはにアクセスできませんSTDOUT。実際、フック スクリプトは STDIN または STDOUT にアクセスできません。
    2. フック スクリプトは、終了値 0 を実行することで成功を示します。それらは、ゼロ以外の終了値を実行することで失敗を示します。
    3. フックがゼロ以外の値で終了した場合、フック スクリプトによって生成された STDERR はクライアントに送信されますが、サブプロセスには送信されません。このようにして、フック スクリプトが失敗した理由をクライアントに説明できます。

他の人が言ったように: オンラインの優れたマニュアルを読んでください。それは一歩一歩物事を通り抜けます。テスト リポジトリを作成し、フック スクリプトをいじります。それらは本当にかなり単純です。私が書いたポストコミットフックを見ることができます。取り付け説明書付きです。多分それは助けになるでしょう。


応答

post-commit を手動で実行すると、「out」行にテキストが含まれます。では、なぜ SVN で動作しないのでしょうか?

リストで番号を付け直して、数値リストにしました。ポイント 3.1 を見てください:フック スクリプトは STDOUT にアクセスできません。私は Python プログラマーではありませんが、STDOUT を使用して出力を別のプロセスにパイプしようとしているようです。フック スクリプトは STDOUT を使用し、その出力は別のプロセスに送信できません。また、STDERR はキャプチャされますが、パイプ経由では送信されません。代わりに、STDERR が収集され、コミットを行ったクライアントに送信されます。このようにして、クライアントにエラーの説明を送信できます。

サブプロセスを開いてテキストを送信できますが、パイプ経由では送信できません。

于 2012-12-03T00:47:16.063 に答える