ubuntu下SVN服務器安裝配置和鉤子
一、SVN安裝
1.安裝包
1.$ sudo apt-get install subversion
2.創建項目目錄
$ 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 = read
auth-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 apache2
2.修改apache配置文件/etc/apache2/mods-available/dav_svn.conf
<Location /svn/mypro>
DAV svn
SVNPath /home/xiaozhe/svn/mypro
AuthType Basic
AuthName "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_name
4.您可以通過下面的命令來訪問文件倉庫:
$ 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/sh
export LANG=zh_CN.UTF-8
sudo /usr/bin/svn update /var/www/myblog --username xiaozhe --password xiaozhe
或更加復雜的同步更新
#Set variable
SVN=/usr/bin/svn
WEB=/home/test_nokia/
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_test_nokia.log
WEBIP="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 following
if [ $? == 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/ >> $LOG
fi
以上是具體的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_Store
images/
利用SVN的鉤子還可以寫出很多的程序來控制SVN 如代碼提交前查看是否有寫日志,是否有tab,有將換成空格,是否有不允許上傳的文件,是否有超過限制大小的文件等等。