2

私はSVNに不慣れで、それを学ぼうとしています。SVNサーバーをセットアップし、チェックイン/チェックアウトできます

それからのファイル。次のステップとして、私はそれにアクセス制御を行おうとしています。また、いくつかのコミットフックを追加しようとしています。

一部の不要なチェックインを防止します。

これが私のsvnリポジトリです:

/svnrepos/repo1
/svnrepos/repo2
/svnrepos/test    >>>>>>> My test repository for playing around with SVN

今、私はpre-commitを使用して次のことを行おうとしています。

1. Preventing some users to check-in to a directory or any of its sub-folders
2. Preventing some files (say .class files) to be checked in by all users

これが私の環境です:

Perl: v5.14.2 (linux 32-bit )
SVN: 1.7.4  (r1295709)
OS: Linux svnserver 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux

コマンド「svnserve-d-r/ svnrepos--log-file/var/log/svn.log」を使用してsvnサーバーを実行しています

現在、リポジトリ/ svnrepos/testへのアクセス制限を提供しようとしています。commit-access-control.cfgファイルを編集して、アクセス制限を提供しようとしています。この構成ファイルの内容は次のとおりです。

[Make everything read-only for all users]
match   = .*
access  = read-only

[Make test project read-write for admin users ]
match  = ^trunk/svnrepos/test/samplefile.txt
users  = PR111319
access = read-write

次の一致パターンは機能していないようです。

match=^trunk/svnrepos/test/samplefile.txt
match=^/svnrepos/test/samplefile.txt
match=/svnrepos/test/samplefile.txt
match=/test/samplefile.txt
match=^/samplefile.txt

どのような一致パターンを指定しても、ファイルsamplefile.txtのコミット中に次のエラーが発生します。

org.apache.subversion.javahl.ClientException: A repository hook failed
svn: Commit failed (details follow):
svn: Commit blocked by pre-commit hook (exit code 1) with output:
/svnrepos/test/hooks/commit-access-control.pl: user `PR111319' does not have permission to commit to 

these paths:
  /
  samplefile.txt

ただし、一致を。*として指定すると、正常にコミットできます。このことから、問題は「一致」にあることがはっきりとわかります。

pre-commitファイルの内容は次のとおりです。

68 REPOS="$1"
69 TXN="$2"
70
71 # Make sure that the log message contains some text.
72 SVNLOOK=/opt/CollabNet_Subversion/bin/svnlook
73 $SVNLOOK log -t "$TXN" "$REPOS" | \
74    grep "[a-zA-Z0-9]" > /dev/null || exit 1
75
76 # Check that the author of this commit has the rights to perform
77 # the commit on the files and directories being modified.
78 /opt/ActivePerl-5.14/bin/perl "$REPOS/hooks/commit-access-control.pl" "$REPOS" "$TXN" "$REPOS/hooks/commit-access-control.cfg" || exit 1
79
80 # All checks passed, so allow the commit.
81 exit 0

さらに情報が必要な場合はお知らせください。

よろしくお願いいたします。Parasuraman.R

4

1 に答える 1

1

まず最初に:

  • Subversionリポジトリは1つだけです。

これを明確にしたいと思います。すべてのリポジトリは同じフックの下にあります。したがって、フックが許可しない限りrepos1、誰もコミットできません。repos2

svnlookフックスクリプトが使用しているので、コマンドを使用してみてください。これにより、pre-commitフックの構成ファイルでファイルを指定する方法についてのより良い手がかりが得られます。

$ svnlook changed -r $revision $repository_directory

は、コマンド$repository_directoryを実行したときのリポジトリを含むディレクトリです。svnadmin create相対パスまたはフルパスのいずれかを指定する必要があります。これ$revisionは、表示しているSubversionリビジョンのリビジョン番号です。いくつかの異なるリビジョンを試して、何が変更されているかを確認してください。次のコマンドで最後のリビジョンを取得できます。

$ svnlook youngest $repository_directory

ファイル名の前に何も表示されておらず/、フルパスが指定されていることに気付くでしょう。


私はいくつかの推奨事項を作成したいと思います:

  • pre-commitSubversionは初めてなので、今はフックを忘れてください。しばらくの間Subversionをフックなしで使用してみて、それがどのように流れるかを理解してください。

  • あなたはあなたのフックで指定されていますが、私はあなたのリポジトリにtrunk表示されません。truck標準のSubversionリポジトリ構造がどのように機能するかについての概念を完全には理解していないように感じます。

Subversionのデフォルトの使用法は、リポジトリのルートに、、、および(はいtrunk、これらはディレクトリ名です)と呼ばれる3つのディレクトリを持つことです。あなたの場合、単一のリポジトリを3つの別々のリポジトリとして扱っているので、おそらく次のディレクトリが必要です。tagsbranches

  • repos1/trunk
  • repos1/tags
  • repos1/branches
  • repos2/trunk
  • repos2/tags
  • repos2/branches
  • test/trunk
  • test/tags
  • test/branches

リポジトリを作成し、開発者がリポジトリに汚い小さな足を置く前に、これらの9つのディレクトリを作成します。リポジトリ内のすべてのファイルは、これらの9つのディレクトリのいずれかに配置されます。

繰り返しますが、これを行わなければならない理由はありません。コードを分岐またはタグ付けしたことがない場合は、実際にこれを行う必要はありません。ディレクトリには、、、、などの名前trunkを付ける必要はありません。それらは、すべてのSubversionケアに対して、、、または、という名前を付けることができます。branchestagsmainbrancheslabelsmoelarrycurly

ただし、他の人は、、、を使用しますtrunkbranchestagsは他の人がそうすると屋根から飛び降りるタイプなので、標準の命名規則にも従うことをお勧めします。

ほとんどの開発は、そのリポジトリtrunkのディレクトリの下で行われます。ブランチを作成する必要がある場合は、その下のファイルを特定のブランチ名のディレクトリにコピーできます。たとえば、リリース1.3の​​バグ修正ブランチを作成する必要があります。trunkbranches

$ svn cp svn://localhost/repos1/trunk svn://localhost/repos1/branches/1.3-bug-fixes

リリース時にファイルにタグを付けるには、作業を行ったディレクトリを次のディレクトリにコピーするだけですtags

$ svn cp svn://localhost/repos1/trunk svn://localhost/repos1/tags/1.3
$ svn cp svn://localhost/repos1/branches/1.3-bug-fixes svn://localhost/repos1/tags/1.3.1

これが、Subversionがタグ付けと分岐を行う方法です。そこにあるほとんどのバージョン管理システムとは異なりますが、多くの優れた利点があります(シンプルで、svn lsコマンドを使用してラベルとブランチの名前を簡単に見つけることができ、ブランチとタグの完全な履歴が得られます)。

  • Subversionがどのように機能し、リポジトリがどのように機能するかを理解したら、pre-commitフックを作成してみてください。私のpre-commitフックを使用することをお勧めします。あなたが使用しているものとは異なり、それは積極的に維持されており、十分に文書化されています。さらに、それは多くの気の利いた機能を備えています。
于 2012-06-11T14:25:18.630 に答える