ubuntu下SVN伺服器安裝配置和鉤子 一、SVN安裝1.安裝包1.$ sudo apt-get install subversion2.建立項目目錄$ sudo mkdir /home/xiaozhe/svn$ cd /home/xiaozhe/svn/$ sudo mkdir mypro 3.建立svn檔案倉庫$ sudo svnadmin create /home/xiaozhe/svn/mypro 4.匯入項目到svn檔案倉庫 (可有可無)$ sudo svn import -m "" 你的檔案夾路徑 file:///home/xiaozhe/svn/mypro 5.存取權限設定修改 /home/xiaozhe/svn/mypro/conf目錄下:svnserve.conf 、passwd 個檔案,行最前端不允許有空格 編輯svnserve.conf檔案,把如下面行取消注釋,並需要頂格anon-access = readauth-access = write password-db = passwd 編輯passwd 如下:[users]andy = andy 6. 開啟svnserve,以SVN根目錄開啟:$ svnserve -d -r /home/xiaozhe/svn 7.檢查是否正常啟動$ netstat -ntlp可以看到有一個連接埠為3690的地址,表示啟動成功(如果使用Apache串連,則跳過下步)8.區域網路訪問,checkout出來SVN庫的檔案svn checkout svn://SvnIp地址/mypro或者簡寫為:svn co svn://SvnIp地址/mypro二、在Ubuntu下使用Apache配置Subversion 1.安裝必要軟體$ sudo apt-get install subversion libapache2-svn apache22.修改apache設定檔/etc/apache2/mods-available/dav_svn.conf<Location /svn/mypro>DAV svnSVNPath /home/xiaozhe/svn/myproAuthType BasicAuthName "myproject subversion repository"AuthUserFile /etc/subversion/passwd#<LimitExcept GET PROPFIND OPTIONS REPORT>Require valid-user#</LimitExcept></Location> 如果需要使用者每次登入時都進行使用者密碼驗證,請將<LimitExcept GET PROPFIND OPTIONS REPORT>與</LimitExcept>兩行注釋掉。當您添加了上面的內容,您必須重新起動 Apache 2 Web 服務器,請輸入下面的命令:$ sudo /etc/init.d/apache2 restart 3.建立 /etc/subversion/passwd 檔案,該檔案包含了使用者授權的詳細資料$ sudo htpasswd -c /etc/subversion/passwd user_name它會提示您輸入密碼,當您輸入了密碼,該使用者就建立了。“-c”選項表示建立新的/etc/subversion/passwd檔案,所以user_name所指的使用者將是檔案中唯一的使用者。如果要添加其他使用者,則去掉“-c”選項即可:$ sudo htpasswd /etc/subversion/passwd other_user_name4.您可以通過下面的命令來訪問檔案倉庫:$ svn co http://hostname/svn/myproject myproject --username user_name或者通過瀏覽器:http://hostname/svn/myproject 三、ubuntu SVN命令大全1、將檔案checkout到本地目錄 svn checkout path(path 是伺服器上的目錄) 例如:$ svn checkout svn://192.168.1.1/pro 簡寫:$ svn co svn://192.168.1.1/pro 2、往版本庫中添加新的檔案 $ svnadd file $ svn add test.php(添加test.php) $ svn add *.php(添加目前的目錄下所有的php檔案) 3、將改動的檔案提交到版本庫$ svn commit -m "LogMessage" [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用–no- unlock開關) 例如:$ svn commit -m 'add test file for my test' test.php 簡寫:$ svn ci 4、更新到某個版本$ svn update -rm path 例如:$ svn update如果後面沒有目錄,預設將目前的目錄以及子目錄下的所有檔案都更新到最新版本。$ svn update -r 200 test.php(將版本庫中的檔案test.php還原到版本200)$ svn update test.php(更新,於版本庫同步。如果在提交的時候提示到期的話,是因為衝突,需要先update,修改文 件,然後清除$ svn resolved,最後再提交commit) 簡寫:svn up 5、刪除檔案$ svn delete path -m 'delete test fle' 例如:$ svn delete test.php 然後再$ svn ci -m 'delete test file' 簡寫:svn (del, remove, rm) 6、比較差異 $ svn diff path(將修改的檔案與基礎版本比較) 例如:$ svn diff test.php $ svn diff -r m:n path(對版本m和版本n比較差異) 例如:svn diff -r 200:201 test.php 簡寫:svn di 7、查看檔案或者目錄狀態1)svn status path(目錄下的檔案和子目錄的狀態,正常狀態不顯示) 【?:不在svn的控制中;M:內容被修改;C:發生衝突;A:預定加入到版本庫;K:被鎖定】 2)svn status -v path(顯示 檔案和子目錄狀態) 第一列保持相同,第二列顯示工作版本號碼,第三和第四列顯示最後一次修改的版本號碼和修改人。 註:svn status、svn diff和 svn revert這三條命令在沒有網路的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。 簡寫:svn st 8、解決衝突$ svn resolved: 移除工作複本的目錄或檔案的“衝突”狀態。 用法: $ resolved PATH… 注意: 本子命令不會依文法來解決衝突或是移除衝突標記;它只是移除衝突的 相關檔案,然後讓 PATH 可以再次提交。 四、同步更新 [勾子]同步程式思路:使用者提交程式到SVN,SVN觸發hooks,按不同的hooks進行處理,這裡用到的是post-commit,利用post-commit到代碼檢出到SVN伺服器的本地硬碟目錄,再通過rsync同步到遠端WEB伺服器上。知識點:1、SVN的hooks# start-commit 提交前觸發事務# pre-commit 提交完成前觸發事務# post-commit 提交完成時觸發事務# pre-revprop-change 版本屬性修改前觸發事務# post-revprop-change 版本屬性修改後觸發事務通過上面這些名稱編寫的指令碼就就可以實現多種功能了,相當強大。 2、同步命令rsync的具體參數使用 3、具有基個語言的編程能力bash python perl都可以實現post-commit指令碼編輯檔案:sudo vim /home/xiaozhe/svn/mypro/hooks/post-commit注意:編輯完成post-commit後,執行:$ sudo chmod 755 post-commit內容:#!/bin/shexport LANG=zh_CN.UTF-8sudo /usr/bin/svn update /var/www/myblog --username xiaozhe --password xiaozhe 或更加複雜的同步更新#Set variableSVN=/usr/bin/svnWEB=/home/test_nokia/RSYNC=/usr/bin/rsyncLOG=/tmp/rsync_test_nokia.logWEBIP="192.168.0.23"export LANG=en_US.UTF-8 #update the code from the SVN$SVN update $WEB --username user --password password#If the previous command completed successfully, to continue the followingif [ $? == 0 ]then echo "" >> $LOG echo `date` >> $LOG echo "##############################" >> $LOG chown -R nobody:nobody /home/test_nokia/ #Synchronization code from the SVN server to the WEB server, notes:by the key $RSYNC -vaztpH --timeout=90 --exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOGfi 以上是具體的post-commit程式注意事項:1、一定要定義變數,主要是用過的命令的路徑。因為SVN的考慮的安全問題,沒有調用系統變數,如果手動執行是沒有問題,但SVN自動執行就會無法執行了。2、SVN update 之前一定要先手動checkout一份出來,還有這裡一定要添加使用者和密碼如果只是手動一樣會更新,但自動一樣的不行。3、加上了對前一個命令的判斷,如果update的時候出了問題,程式沒有退出的話還會繼續同步代碼到WEB伺服器上,這樣會造成代碼有問題4、記得要設定所屬使用者,因為rsync可以同步檔案屬性,而且我們的WEB伺服器一般都不是root使用者,使用者不正確會造成WEB程式無法正常工作。5、建議最好記錄日誌,出錯的時候可以很快的排錯6、最後最關鍵的資料同步,rsync的相關參數一定要清楚,這個就不說了。注意幾個情境:這裡的環境是SVN伺服器與WEB伺服器是開的把SVN伺服器定義為原始伺服器 WEB伺服器為目的伺服器陣列景一、如果目的WEB伺服器為綜合的混雜的,像只有一個WEB靜態資源,使用者提交的,自動產生的都在WEB的一個目錄下,建議不要用–delete這個參數上面這個程式就是這樣,實現的是原始伺服器到目的伺服器的更新和添加,而沒有刪除操作,WEB伺服器的內容會多於源SVN的伺服器的情境二、實現鏡像,即目的WEB伺服器與源SVN伺服器一樣的資料,SVN上任何變化WEB上一樣的變化,就需要–delete參數情境三、不需要同步某些子目錄,可能有些目錄是緩衝的臨時垃圾目錄,或者是專用的圖片目錄(而不是樣式或者排版的)要用exclude這個參數注意:這個參數的使用不用寫絕對路徑,只要目錄名稱就行 aa代表檔案 aa/ 代表目錄 ,缺點就是如果有多個子目錄都是一樣的名稱那麼這些名稱就都不會被同步建議用–exclude-from=/home/svn/exclude.list 用檔案的形式可以方便的添加和刪除exclude.list .svn/.DS_Storeimages/ 利用SVN的鉤子還可以寫出很多的程式來控制SVN 如代碼提交前查看是否有寫日誌,是否有tab,有將換成空格,是否有不允許上傳的檔案,是否有超過限制大小的檔案等等。