1

svnlook を使用して、変更/追加されたリポジトリのファイルのみを自動的に更新したいと考えています。リポジトリにいくつかのアプリがあり、すべてのファイルが変更されている可能性があります。svnlook changed pathtomyrepを実行すると、ファイルが表示されます。これがステップ 1 です。それをバッチファイルで使用して、コミットフックで変更されたファイルのみを更新するにはどうすればよいですか? このバッチ ファイル (post-commit.bat) があります。

@ECHO OFF
SET REPOS=%1
SET REV=%2
SET CHANGES=svnlook changed %REPOS% -r %REV% 
FOR /F "usebackq" %%a IN (`%CHANGES%`) DO (svn update %%a)

しかし、何も起こらず、コードは更新されません! ファイルが一般的に機能することはわかっています。他のものを入力すると、実行されます。U ファイル名の代わりにローカルでテストすると、Uのみが取得されます。どうしたの?

ありがとう :)

4

1 に答える 1

1

変更/追加されたリポジトリのファイルのみを自動的に更新したい(svnlookを使用して) 。

あなたは自分が何をしたいのかはっきりしていません。

  1. ある種の ...たとえば... Web サイトを実行していて、開発者が Subversion リポジトリのファイルを変更したときに、それらの変更で Web サイトを自動的に更新したいですか?
  2. ディレクトリを監視していて、そのディレクトリでファイルが変更された場合、それらの変更を Subversion リポジトリに保存しますか?

コミット後またはコミット前のフック スクリプトでは #2 を実行できないため、#1 を実行することをお勧めします。pre-commit/post-commit フック スクリプトは、誰かがコミットしたときにのみ実行されるため、ディレクトリ自体を変更することはできません。

したがって、リポジトリにファイルがあり、それらのファイルを使用する何らかのサーバーにディレクトリがあります。リポジトリに変更があったときに、これらのファイルを自動的に更新するプロセスが必要です。

これを処理するいくつかの方法:

  1. サーバーとファイルを含むマシン上。ファイルを含むディレクトリが Subversion の作業ディレクトリであることを確認してください。Subversion 1.7 を使用している場合、唯一の.svnディレクトリは作業ディレクトリのルートにあるため、作業が少しすっきりして管理しやすくなります。ここで必要なのは、スケジュールされたタスク (Unix 用語での cronjob) だけです。たとえば、5 分ごとに実行されます。このタスクは、その作業ディレクトリで更新を実行するだけです。コミット後のフックは必要ありません。
  2. post-commit フック スクリプトからアクセスできる Subversion サーバー上の作業ディレクトリを作成できます。コミットが発生すると、ポストコミット フックがその作業ディレクトリを更新し、これらのファイルがあるサーバー上のディレクトリに対してrsyncを実行します。rsyncは変更されたファイルのみをコピーするため、ディレクトリの内容全体をコピーするよりも高速です。問題は、すべてのコミットの後、コミットを行ったユーザーがコミット後のフックがその作業ディレクトリと rsync を更新するのを待ってから、他のことを行う必要があることです。
  3. より良い方法は、Jenkinsのような継続的インテグレーション ツールを使用して、コミット後のフックに頼るのではなく、誰かがコミットを行うたびに必要なことを自動的に行うことです。Jenkins はすべてをログに記録し、問題があったかどうかを知らせます。

私の好みは#3で、次に#1です。post-commit フックを使用すると、単に Subversion の速度が低下し、開発者がイライラします。Jenkins は簡単にセットアップして実行できます。それらのサポートは優れており、Subversion と同様に無料のオープン ソース ツールです。

これらのファイルを含むサーバーがコミット後に自動的に更新を実行するように Jenkins をセットアップできます。実際、セットアップは非常に簡単です。ただし、通常は次のことをお勧めします。

  1. サーバーは directory を使用するように構成されていますC:\foo
  2. コミットを更新し、ディレクトリC:\barsvn export作成し、ディレクトリなしで新しいクリーンなディレクトリを作成します.svn
  3. svn export finishes, you renameC:\bar toC:\foo`の後。サーバーは現在、新しいディレクトリを使用しています。

これには、ファイルの更新中にサーバーがディレクトリを使用しないという利点があります。、、、の 3 つのファイルがあるfilea.txtfileb.txtfilec.txtます。fileb.txtとに変更が加えられfilec.txtます。これらの変更は一緒に行われ、同時に展開されないと悲惨な結果が発生します (解雇されます)。

更新プロセスのある時点で、fileb.txtは新しいバージョンにfilec.txtなり、 は古いバージョンになります。確かに、更新が完了する前にサーバーが の新しいバージョンfileb.txtと古いバージョンの両方を使用する可能性はほとんどありませんが、それに賭けてみませんか? .filec.txt

そこで、Subversion の速度を落とさずにやりたいことをやってくれる Jenkins を見てみましょう。さらに、すべてのアクションをログに記録します。このようにして、どのファイルが変更されたか、更新が成功したかどうか、および必要に応じて変更を簡単にロールバックする機能を確認できます。さらに、サーバー プロセスに特定の変更を加えたくない場合に、Jenkins による更新を一時的に停止する方がはるかに簡単です。

于 2012-01-06T16:19:42.743 に答える