21


12

私は自分のWeb開発作業にSVNリポジトリを使っています。 リポジトリのチェックアウトを保持する開発サイトをセットアップしました。

SVNのコミット後フックを設定しましたので、リポジトリにコミットが行われるたびに開発サイトが更新されます。

cd / home / www / dev_ssl / usr / bin / svn up

これはうまくいきますが、リポジトリのサイズのために更新には長い時間がかかります(およそ 3分)これは定期的なコミットをするときかなりイライラするものです。 コミット後のフックを変更して、コミットされたファイル/ディレクトリのみを更新するようにしたいのですが、これを実行する方法がわかりません。 「最も低い共通ディレクトリ」を更新することはおそらく最善の解決策でしょう。

フォローファイルをコミットする場合:

  • /branches/feature_x/images/logo.jpg

  • /branches/feature_x/css/screen.css

それはディレクトリを更新するでしょう:/ branches / feature_x /

誰かが私がこれを達成するソリューションを作成するのを手伝ってくれる?

更新

  • リポジトリと開発サイトは同じサーバー上にあるので、ネットワークの問題は関係ありません。

  • CPU使用率は非常に低く、I / Oは問題ないはずです(ハイスペックの専用サーバーで実行されています)。

  • 開発サイトは約です。 サイズが7.5GBで、約が含まれています。 60万アイテム、これは主に複数のブランチ/タグがあるためです

4 Answer


18


変更された各フォルダの内容だけを更新するために* svnlook dirs-changed ` svn up -N` *を使うかもしれません:

cd /home/www/dev_ssl
svnlook dirs-changed [REPOS] -r [REV] | xargs /usr/bin/svn up -N

あるいは、ファイルごとのほうが良い場合(アクション文字を取り除くために `sed`を使う):

svnlook changed [REPOS] -r [REV] | sed "s/^....//" | xargs /usr/bin/svn up


11


#!/ bin / bash

REPOS = "$ 1" REV = "$ 2"

#A  - リポジトリに追加されたアイテム#D  - リポジトリから削除されたアイテム#U  - ファイルの内容が変更された#_U  - アイテムのプロパティが変更された。先頭のアンダースコアに注意してください。#UU  - ファイルの内容とプロパティが変更されました。

#ディレクトリパスは末尾の "/"文字で表示されるため、ファイルとディレクトリを区別できます。

LOOK = / usr / local / svn / bin / svnlook SVN = / usr / local / svn / bin / svn DEV = / var / www / test

`$ LOOKの変更はcd / var / tmp / svnに変更されました。 awk '{print $ 1 "=" $ 2;}' `; do len = $ {#changes} idx = `expr index" $ changes "=`; directory = $ {changes:$ idx}; action = $ {変更:0:$ idx-1}; [$ {changes:len-1} = '/']の場合、 "A"に "$ action"を入れます。)\ mkdir --mode = 775 -p $ DEV / $ディレクトリ。誰もいない:誰も$ DEV / $ディレクトリはありません。 chmod 775 $ DEV / $ディレクトリ。 ;; "D")\ rmdir $ DEV / $ディレクトリ。 ;;それ以外の場合は "A" | "U" | "UU"内の "$ action" \ $ SVNエクスポート--force --non-interactive -r HEAD -q file:// $ REPOS / $ directory; BASE = `basename $ directory`; DIR = `dirname $ directory`;誰もいない:誰も$ BASEを使わない。 chmod 775 $ BASE。 mkdir --mode = 775 -p $ DEV / $ DIR; cp -f --preserve =所有権$ BASE $ DEV / $ DIR; $ BASEをリンク解除します。 ;; "D")\ rm -f $ DEV / $ディレクトリ。 ;; esac fiが完了

0番出口


1


Windowsの場合

/ F "eol =¬delims =¬"%s内の( 'svnlookディレクトリの変更%1 -r%2')do svn export "file:/// c:/ path / to / repo / %% A "" c:/ svn_exports / %% A "--force

上記をコミット後のフックバッチファイル(またはVisualSVNのウィンドウ)にコピーするだけで完了です。更新されたディレクトリはc:\にエクスポートされます。

上記のc:/ path / to / repoの代わりに%1を使用することもできますが、VisualSVNではバックスラッシュのパス区切り文字を使用して%1パスを指定し、svnlookではスラッシュを使用しているため機能しません。 これは正しく動作していないようなので、リポジトリパスをハードコーディングしました(「ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません」というエラーが表示されました)。


0


このホームメイドのスクリプトを見てみましょう:http://envrac.blogdns.net/shellscripts/export-automatique-d-un-projet-subversio!