2012-06-11 40 views
1

我是SVN的新手,試圖學習它。我已經設置了SVN服務器,並且我可以通過它登記/登出SVN:Commit-access-control.cfg問題

文件。 作爲下一步,我試圖對其進行訪問控制,並試圖添加一些提交掛鉤到

防止一些不需要的檢入。

這裏是我的svn庫:

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

現在我嘗試做以下使用預先承諾:

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服務器「

現在我試圖提供對repository/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 

不管匹配模式我給,我收到以下錯誤,而commiting文件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 

但是,如果我將匹配作爲*,那麼我能夠成功提交它。從此,我很清楚,問題在於「匹配」

這裏是預提交文件的內容:

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

+0

您似乎對SVN存儲庫的組織方式感到非常困惑。我甚至不知道從哪裏開始。 'repo1','repo2'和'test'全部由服務器單獨提供。每個存儲庫對「svnrepos」目錄一無所知(它只指定服務器的位置以知道存儲庫的位置)。所以包含'svnrepos'的任何'match'都是無意義的。 「表達式」trunk \ svnrepos ...' - 你從哪裏得到那個'trunk'?我認爲你需要[進一步閱讀](http://svnbook.red-bean.com/en/1.7/svn-book.html)。 –

+0

@malenkiy_scot感謝您的回覆。 「commit-access-control.cfg」文件包含一個示例部分,其中顯示了以下內容:[[但是,我們不信任Joe和project1的Makefile] match = ^(branches | trunk |/project1/Makefile users = joe access = read-only'這就是我得到'trunk'這個詞的地方。 我使用命令'svnadmin create test'創建了存儲庫。之後,我嘗試使用subclipse SVN插件在我的eclipse中打開它。從日食我連接到該存儲庫使用svn:// /test.added samplefile.txt並簽入相同。 – Parasu

+0

因此,該文件位於存儲庫「測試」中。因此,我試着像'^/test/samplefile.txt,^/samplefile.txt,/test/samplefile.txt,^ trunk/test/samplefile.txt',但都得到相同的錯誤。我目前正在通過文檔。希望我會學習基礎知識:) – Parasu

回答

1

第一件事,第一:

  • 你只有一個Subversion版本庫。

我只是想說清楚。您所有的存儲庫都將處於相同的掛鉤狀態。因此,除非您的掛鉤允許,否則沒有人可以承諾repos1repos2

嘗試使用svnlook命令,因爲這是鉤子腳本正在使用的。這會給你如何在你的pre-commit鉤子的配置文件中指定文件更好的線索:

$ svnlook changed -r $revision $repository_directory 

$repository_directory是包含存儲庫,當你做了svnadmin create命令的目錄。你需要給它相對路徑或完整路徑。 $revision是您正在查看的Subversion修訂版的修訂版號。嘗試了幾個不同的版本,看看有什麼正在改變您可以通過這個命令得到最後修訂:

$ svnlook youngest $repository_directory 

什麼,你會注意到的是,有沒有/在文件名的前面,以及完整路徑被指定。


我想提出幾點建議:

  • 因爲你是新的顛覆,忘記pre-commit鉤現在。嘗試使用Subversion一段時間sans掛鉤,並瞭解它如何流動。

  • 您的trunk已在您的掛鉤中指定,但我在您的存儲庫中看不到truck。我有一種感覺,你沒有完全理解標準Subversion版本庫結構的工作原理。

默認使用Subversion的是要有三個目錄稱爲trunktagsbranches(是的,這些都是目錄名),你的根源。在你的情況,你可能需要以下目錄,因爲你對待你的單一信息庫三個獨立的:

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

創建你的資料庫,那麼之前你的任何開發者能夠獲得對信息庫的骯髒的小爪子,創建這九個目錄。您的存儲庫中的所有文件將被放置在這九個目錄中的一個目錄下。

再一次,沒有理由爲什麼必須這樣做。如果你永遠不會分支或標記你的代碼,你真的不必這樣做。這些目錄甚至不必被命名爲trunk,branchestags。他們可以被命名爲main,branches,labelsmoelarry,curly,用於所有Subversion託管。

但是,其他人都使用trunk,branchestags,因爲如果其他人都跳過屋頂,我建議你也遵循標準命名慣例。

大多數開發發生在trunk目錄下存儲庫。如果您需要創建分支,則可以使用特定分支名稱將trunk下的文件複製到branches目錄。例如,我需要創建一個bug修復分行發行1.3:

$ 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 hook。與您正在使用的不同,它正在積極維護並且有詳細記錄。另外,它有很多漂亮的功能。
+0

我認爲在答案的開頭有一個拼寫錯誤,它應該顯示爲「您只有一個Subversion _hook_」,而不是「只有一個Subversion _repository_」。 –

+0

@malenkiy_scot - 通常當你使用'svnserve'時,你正在運行一個倉庫,這意味着一組鉤子。 –

+0

這是不正確的。您可以擁有多個存儲庫(具有單獨的修訂計數,可以分別移動到不同的服務器),並且每個存儲庫都在其自己的「hooks」目錄中擁有自己的一組掛鉤。如果你爲它們使用單​​獨的'svnadmin create',那將會發生什麼。現在,'commit-access-control.pl'鉤子的通常設置是讓它在每個存儲庫中共享並從'pre-commit'鉤子調用,同時每個存儲庫都有'commit-access-control.cfg'設置。所以實際上他們共享一個鉤子(雖然他們不需要)。 –