私は、雇用主の組織のリードWeb開発者として、各WebアプリケーションのSVNリポジトリーの構成と保守を担当しています。それぞれにいくつかのアーカイブバージョンと少なくともいくつかのブランチがあります。
現在、各Webサイトの最新バージョンをデプロイするために、適切なタグ付きバージョンを、Apacheがそのサイトにサービスを提供しているディレクトリに「エクスポート」しています。たとえば、/ var/www/dev/appで作業コピーをチェックアウトしていると仮定します。
$ cd /var/www/dev/app/archive/1.2
$ svn export . /var/www/html/www.myapp.com
しかし、実際には、ライブサイトをリポジトリバージョンにリンクして、「svnupdate」を実行して最新の更新をプルできるようにしたいと思っています。ライブデプロイメントディレクトリ内のファイルや小さな変更をリポジトリにコミットして戻したくないだけです。
私がやりたいのは、リポジトリに読み取り専用のブランチを作成することです。このブランチには、常に最新の製品バージョンのアプリケーションが含まれており、デプロイメントディレクトリにチェックアウトできます。
私はこれが多くのオープンソースプロジェクトで行われているのを見てきました。誰でもアプリケーションの特定のブランチをチェックアウトできますが、それは読み取り専用ブランチなので、コミットし直すことはできません。
どうすればこれを達成できますか?
Apacheを使用してSubversionリクエストをインターフェースしている場合は、 Subversion Authorization file を使用して、すべてのタグの場所へのアクセスを制御できます。そこから、tagsフォルダーへの読み取り専用として許可された独自のアカウントを持つようにWebサーバーを設定できます。 Webサーバーが、特定のパスにあるタグディレクトリ以外の読み取りアクセス権を持たないようにすることもできます。
本番デプロイメントに使用されるのと同じ名前のタグを常に作成する場合は、svnアップデートが機能します。それ以外の場合は、必要に応じてsvnスイッチを実行してタグ間を移動できます。 Subversion book によると、svnupdateとsvnswitchは内部でほとんど同じことを行います。
これを使用する利点として、開発者が実行できることと実行できないことをよりきめ細かく制御することもできます。また、リポジトリのどの部分を公開用にするか、どの部分を公開しないかを制御することもできます。
これを設定する場合、およびWebサイトが公開されている場合は、.svnフォルダー内のコンテンツを提供しないようにWebサーバーに指示してください。
すべてのコミットをオフにするには、次のような事前コミットフックスクリプトを追加します。
#!/bin/sh
echo "Read-only SVN; no commits allowed!" 1>&2
exit 1
または、1つのパスのみを読み取り専用にしたい場合(1つのブランチなど)、次のことを試してください。
#!/bin/bash
REPOS="$1"
TXN="$2"
if svnlook changed $REPOS -t $TXN |grep -q "mybranch/" ; then
echo "Read-only branch mybranch/; no commits allowed! " 1>&2
exit 1
fi
exit 0
もちろん、そのif
ステートメントで必要な他のチェックを行うことができます。
潜在的なコミットの変更されたパスをチェックし、問題のブランチの作成を許可されているユーザーからのものでない限り、指定されたブランチにコミットするコミットを拒否するpre-commitフックスクリプトを追加します。
サーバー側のリポジトリ権限からこれを行うこともできます。それらを実行する方法は、リポジトリを公開する方法によって異なります。