centos下直接用yum安裝svn
php
yum install subversion
檢查svn版本linux
svnserve --version
1、創建版本庫vim
建立svn數據目錄(subversion默認是把/var/svn做爲數據根目錄的,開機啓動默認也是從這裏)centos
mkdir -p /var/svn
建立版本庫bash
svnadmin create /var/svn/test
若是刪除版本庫服務器
rm -rf /var/svn/test
2、導入導出工程項目ide
當咱們拿到程序給咱們的代碼以後,咱們就須要在svn服務器上將工程導入倉庫,假如咱們的網站是放在/var/www/test目錄下
svn
svn import /var/www/test file:///var/svn/test -m "test"
-m後是咱們取的工程名
post
咱們須要從倉庫導出一份代碼,這樣才能實如今svn服務器上修改代碼,update到運行目錄網站
svn checkout svn://localhost:3777/test /var/www/final
其中/var/www/final是咱們最後部署上線的目錄
3、配置svn配置文件
每一個版本庫建立以後都會生成svnserve.conf主要配置文件
vim /var/svn/test/conf/svnserve.conf
[general] anon-access = none #控制非鑑權用戶訪問版本庫的權限 auth-access = write #控制鑑權用戶訪問版本庫的權限 password-db = passwd #指定用戶名口令文件名 authz-db = authz #指定權限配置文件名 realm = test #指定版本庫的認證域,即在登陸時提示的認證域名稱
4、編輯svn用戶配置文件
vim /var/svn/test/conf/passwd
[users] admin = admin #用戶,密碼 fuhd = fuhd #用戶,密碼 test = test #用戶,密碼
5、編輯svn權限控制配置文件
vim /var/svn/test/conf/authz
[groups] admin = admin #admin爲用戶組,等號以後的admin爲用戶 test = fuhd,test [test:/] #表示根目錄(/var/svn/test),test: 對應前面配置的realm = test @admin = rw #表示admin組對根目錄有讀寫權限,r爲讀,w爲寫 [test:/test] #表示test目錄(/var/svn/test/test) @test = rw #表示test組對test目錄有讀寫權限
6、利用鉤子hooks自動更新提交代碼到網站目錄
須要編輯
vim /var/svn/test/hooks/post-commit
#!/bin/sh REPOS="$1" REV="$2" export SVN_PATH=/usr/bin/svn WEB_PATH=/data/www/final SVN_USER=test SVN_PW=test LOG_PATH=/var/log/svn.log echo `date "+%Y-%m-%d %H:%M:%S"` >>$LOG_PATH echo `whoami`,$REPOS,$REV >>$LOG_PATH $SVN_PATH update $WEB_PATH --username $SVN_USER --password $SVN_PW --no-auth-cache >>$LOG_PATH || exit 1 chown -R www:www $WEB_PATH exit 0
保存退出後
chmod +x post-commit
這樣每次提交後都會更新到咱們的網站目錄。
其餘hooks的做用以下
post-commit
在提交完成,成功建立版本以後執行該鉤子,提交已經完成,不可更改,所以本腳本的返回值被忽略。
post-lock
對文件進行加鎖操做以後執行該腳本
post-revprop-change
在修改 revision 屬性以後,執行該腳本。由於修改稿已經完成,不可更改,所以本腳本的返回值被忽略(不過實際上的實現彷佛是該腳本的正確執行與否影響屬性修改)
post-unlock
對文件進行解鎖操做以後執行該腳本
pre-commit
在 Subversion transaction 完畢以後,在提交以前,執行該腳本
pre-lock
對文件進行加鎖操做以前執行該腳本
pre-revprop-change
在修改 revision 屬性以前,執行該腳本
pre-unlock
對文件進行解鎖操做以前執行該腳本
start-commit
在客戶端尚未向服務器提交數據以前,即尚未創建 Subversion transaction(縮寫爲 txn) 以前,執行執行該腳本
7、啓動,查看和中止SVN服務
啓動SVN服務
# -d:守護進程 -r:svn數據根目錄 --listen-port:監聽端口 svnserve -dr /var/svn/test --listen-port 3690
查看SVN服務
ps aux|grep svnserve #默認端口爲:3690
注意打開防火牆和關閉selinux
vim /etc/sysconfig/selinux
SELINUX = disable #值修改成disable
遇到的問題
import的時候提示錯誤
svn: E000022: Error converting entry in directory '/var/www/test/images' to UTF-8 svn: E000022: Can't convert string from native encoding to 'UTF-8':
問題就是環境變量的編碼設置的很差,解決辦法
vim ~/.bashrc
加上
export LC_ALL=en_US.UTF-8 export.UTF-8 export LANGUAGE=en_US.UTF-8
source ~/.bashrc
update的時候提示錯誤
post-commit hook failed (exit code 1) with output: Conflict discovered in '/data/www/index.php', Select: (p) postpone, (df) diff-ful, (e) edit. (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: svn: E070014: Can't read stdin: End of file found
因爲更新的問題,網站和svn裏的文件不一致,從svn checkout一份文件覆蓋到網站裏面去
svn checkout --depth=empty file:///svn/www/ www cd www svn update index.php
其中,www爲checkout後的文件夾名,本身能夠隨意指定,執行svn checkout命令後,會獲得一個名爲www的空目錄,裏面什麼都沒有,而實現這一效果的就是參數中指定的depth=empty。下一步就是進入剛剛checkout下來的www目錄,執行update操做,想取哪一個文件就checkout哪一個文件就行了。最後把不一致的文件copy到網站去覆蓋原有文件(最好把原有文件備份一份)。