Svn是比較優秀的版本控制工具,雖然功能和性能上沒法和Git媲美,但因爲其容易搭建和使用的特性,因此在各個小公司仍是很受歡迎的。使用Git可參考《版本控制-Git服務器搭建和經常使用命令使用》本文介紹svn服務器搭建和經常使用命令介紹。php
1、搭建 svn 服務器 html
[root@master data1]# cat /etc/issue CentOS release 6.3 (Final) Kernel \r on an \m [root@master data1]# getconf LONG_BIT 64
一、安裝svn服務器mysql
[root@master data1]# yum install subversion -y
若是須要更新 svn 版本可使用 wandisco 的 yum 源web
rpm -qa | grep subversion 查找已安裝版本 yum remove subversion-1.6.11-15.el6_7.x86_64 -y 卸載安裝的1.6版本
vim /etc/yum.repos.d/wandisco-svn.repo 添加下面代碼
[WandiscoSVN] name=Wandisco SVN Repo baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.9/RPMS/$basearch/ enabled=1 gpgcheck=0
yum clean all yum install subversion -y
二、新建svn服務器目錄並初始化第一個倉庫projectsql
mkdir /data1/svn svnadmin create /data1/svn/project
三、新建文件夾並導入服務器做爲Svn倉庫project的第一個文件夾shell
cd /data1 mkdir -p test/client test/server svn import test file:///data1/svn/project/ -m 'init svn project' rm -rf test
這樣就將test目錄下的client和server文件夾導入到倉庫project下,而後刪掉test文件夾數據庫
四、新增用戶並設置密碼apache
修改文件 /data1/svn/project/conf/passwd 新增用戶 lx、u一、u二、u3,對應的明文密碼在 "=" 右邊vim
[users] # harry = harryssecret # sally = sallyssecret lx = lx_passwd u1 = u1_passwd u2 = u2_passwd u3 = u3_passwd
五、添加羣組並增長訪問控制windows
修改文件 /data1/svn/project/conf/authz,增長g_lx和g_user兩個羣組,並對project倉庫設置訪問控制權限,不一樣目錄容許不一樣羣組的不一樣操做
[groups] g_lx = lx g_user = u1, u2, u3 [project:/] @g_lx = rw * = [project:/server] @g_lx = rw @g_user = r * = [project:/client] @g_lx = rw @g_user = rw * =
r 表示對該目錄有讀權限,w 表示對該目錄有寫權限,rw 表示對該目錄有讀寫權限。最後一行的* =表示,除了上面設置了權限的用戶組以外,其餘任何人都被禁止訪問本目錄,這點比較重要。
六、升級成http認證服務器
升級http須要安裝相關軟件
yum install httpd mod_dav_svn
http之支持加密的密碼,因此須要將svn的明文密碼轉換
touch webpasswd htpasswd -b webpasswd lx lx_passwd
一步一步轉換或者在 /data1/svn/project/conf 目錄下新建下面perl腳本 pd.pl
#!/usr/bin/perl use warnings; use strict; open (FILE, "passwd") or die ("Cannot open the passwd file!\n"); open (OUT_FILE, ">webpasswd") or die ("Cannot open the webpasswd file!\n"); close (OUT_FILE); foreach (<FILE>) { if($_ =~ m/^[^#].*=/) { $_ =~ s/=//; `htpasswd -b webpasswd $_`; } }
運行 perl pd.pl 輸出: Adding password for user lx Adding password for user u1 Adding password for user u2 Adding password for user u3
七、修改 httpd.conf 文件
vim /etc/httpd/conf/httpd.conf 在文件最後添加 <Location /project> DAV svn SVNPath /data1/svn/project/ AuthType Basic AuthName "svn for project" AuthUserFile /data1/svn/project/conf/webpasswd AuthzSVNAccessFile /data1/svn/project/conf/authz Satisfy all Require valid-user </Location>
八、修改文件夾屬主爲apache
chown -R apache.apache /data1/svn/project/
九、啓動 httpd
service httpd start
十、打開web頁面 http://master/project/
建議更換成ip地址。輸入帳戶密碼以下:
十一、若是出現 (13)Permission denied: Could not open password file: /data1/svn... 則是由於SELinux未關閉,受權是無效的,須要修改SVN目錄的權限配置。運行下面的命令
chcon -R -h -t httpd_sys_content_t /data1/svn/project
成功運行後刪掉 passwd 文件,這樣密碼就只有你知道了
十二、升級 https
通常公司的Svn服務器會搭建成https認證的服務器,密碼則是使用ldap認證,因此搭建起來比較麻煩,除了httpd以外還要open-ssl等插件支持,但足夠安全和實用。
yum install openssl mod_ssl -y
cd /etc/httpd/conf openssl genrsa -des3 -out server.key 1024 命令運行期間須要用戶輸入並確認本身的密碼 對憑證進行填寫必要信息,須要填寫國家(CN),郵箱,公司等等,按要求填寫便可(後面好像不須要用到) openssl req -new -key server.key > server.csr 生成證書 openssl req -x509 -days 2048 -key server.key -in server.csr > server.crt
修改配置文件 httpd.conf
vim httpd.conf 增長 LoadModule ssl_module modules/mod_ssl.so 在<Location /project>中的最後加上 SSLRequireSSL 在文件最後加上 SSLMutex default SSLRandomSeed startup builtin SSLSessionCache none ErrorLog /var/log/httpd/SSL.log LogLevel info SSLEngine On SSLCertificateFile conf/server.crt SSLCertificateKeyFile conf/server.key
重啓 httpd,輸入密碼便可
頁面上訪問 https://master:443/project/
1三、commit 的時候提交備註
在 hooks 目錄下面增長 pre-commit 文件便可,文件內容能夠參考 pre-commit.tmpl 須要注意的是若是是中文在windows下可能會顯示不了
#!/bin/sh REPOS="$1" TXN="$2" SVNLOOK=/usr/bin/svnlook LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c) if [ "$LOGMSG" -lt 10 ]; then echo -e "\n Please submit a comment greater than 10 characters."1>&2 exit 1 fi
1四、密碼使用mysql保存驗證
首先須要 按照 mod_auth_mysql
yum install mod_auth_mysql -y
配置可參考 http://modauthmysql.sourceforge.net/CONFIGURE
修改 httpd.conf 添加
LoadModule mysql_auth_module modules/mod_auth_mysql.so
在 <location /project> 中修改
AuthMySQLEnable On AuthMySQLHost master AuthMySQLPort 3306 AuthMySQLSocket /data1/mysql/3306/mysql.sock AuthMySQLUser svn AuthMySQLPassword xxxx AuthMySQLDB user AuthMySQLUserTable user_auth AuthMySQLNameField user_name AuthMySQLPasswordField passwd AuthMySQLNoPasswd Off AuthMySQLPwEncryption md5 # 密碼加密 md5 # AuthMySQLSaltField AuthMySQLCharacterSet utf8 AuthMySQLAuthoritative On # 只支持 mysql 驗證 取消其餘驗證方式
在數據庫 user 中新建一個表以下
mysql> show create table user_auth\G *************************** 1. row *************************** Table: user_auth Create Table: CREATE TABLE `user_auth` ( `user_name` varchar(32) NOT NULL COMMENT '用戶英文名', `passwd` varchar(256) NOT NULL COMMENT '用戶密碼', `last_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間', PRIMARY KEY (`user_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶認證' 1 row in set (0.00 sec)
並新建用戶
grant all privileges on user.user_auth to 'svn'@'master' identified by 'xxxx';
重啓 httpd 便可。
若是遇到
MySQL ERROR: Can't connect to MySQL server on 'master' (13)
解決方法
1. 查看httpd_can_network_connect的值是否爲off(例如:httpd_can_network_connect --> off) # getsebool -a | grep httpd 2. 修改httpd_can_network_connect的值爲on # setsebool httpd_can_network_connect 1 3. 從新驗證httpd_can_network_connect # getsebool -a | grep httpd 4. 重啓http # service httpd restart
若是遇到
Permission denied: make_sock: could not bind to address [::]:80
則使用
semanage port -a -t http_port_t -p tcp 80
但因爲個人 semanage 一直安裝失敗但要下載一大堆依賴包,太麻煩了,我就使用了下面的方法
setenforce 0 # 寬鬆模式 service httpd restart setenforce 1 # 強制模式
shell 下求 MD5 值的方法
echo -n '12345'|md5sum|cut -d ' ' -f1 827ccb0eea8a706c4c34a16891f84e7b
1五、若是配置辦公網訪問通常須要關閉 iptables 或者配置
iptables -nvL --line-number # 查看規則 iptables -I INPUT 4 -i eth0 -p tcp -s 10.1.126.0/8 --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT # 在第4行插入443端口輸入規則 iptables -I OUTPUT 1 -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT # 第一行插入443端口輸出規則
2、svn經常使用命令
一、checkout到本地目錄
svn -–username=*** --password=*** checkout path
二、往版本庫中添加新的文件
svn add file
三、將改動的文件提交到版本庫
svn commit -m "LogMessage" [-N] [--no-unlock] PATH
# 若是選擇了保持鎖,就使用–no-unlock開關 # -m 後面是提交的日誌信息,通常狀況是必填的。
簡寫:svn ci
四、加鎖/解鎖
svn lock -m "LockMessage" [--force] PATH
五、本地更新到某個版本
svn update -r * path # *爲版本號 svn update # 整個文件夾 svn update file # 單獨一個文件
六、查看文件或者目錄狀態
1)svn status path #目錄下的文件和子目錄的狀態,正常狀態不顯示 【?:不在svn的控制中;M:內容被修改;C:發生衝突;A:預約加入到版本庫;K:被鎖定】 2)svn status -v path # 顯示文件和子目錄狀態 第一列保持相同,第二列顯示工做版本號,第三和第四列顯示最後一次修改的版本號和修改人。 注:svn status、svn diff和svn revert這三條命令在沒有網絡的狀況下也能夠執行的,緣由是svn在本地的.svn中保留了本地版本的原始拷貝。 簡寫:svn st
七、刪除文件
svn delete path -m "delete test fle" 例如:svn delete svn://master/project/test.php -m 「delete test file」 或者分步驟(推薦使用這種) svn delete test.php svn ci -m ‘delete test file‘ 簡寫:svn [del, remove, rm]
八、查看日誌
svn log file 顯示這個文件的全部修改記錄,及其版本號的變化
九、查看文件詳細信息
svn info file
十、比較差別
svn diff path # 將修改的文件與基礎版本比較 例如:svn diff test.php svn diff -r m:n path # 對版本m和版本n比較差別 例如:svn diff -r 200:201 test.php 簡寫:svn di
十一、將兩個版本之間的差別合併到當前文件
svn merge -r m:n path 例如:svn merge -r 200:205 test.php # 將版本200與205之間的差別合併到當前文件,可是通常都會產生衝突,須要手動修改文件
十二、Svn 幫助
svn help
svn help ci
1三、版本庫下的文件和目錄列表
svn list path # 顯示path目錄下的全部屬於版本庫的文件和目錄 簡寫:svn ls
1四、建立歸入版本控制下的新目錄
svn mkdir * # 建立歸入版本控制下的新目錄。 用法: (1)、mkdir PATH… (2)、mkdir URL… 建立版本控制的目錄。
(1)、每個以工做副本 PATH 指定的目錄,都會建立在本地端,而且加入新增調度,以待下一次的提交。 (2)、每一個以URL指定的目錄,都會透過當即提交於倉庫中建立.在這兩個狀況下,全部的中間目錄都必須事先存在。
1五、恢復本地修改
svn revert: 恢復原始未改變的工做副本文件 (恢復大部份的本地修改)。
用法: revert PATH…
注意: 本子命令不會存取網絡,而且會解除衝突的情況。可是它不會恢復被刪除的目錄
1六、代碼庫URL變動
svn switch (sw): 更新工做副本至不一樣的URL。 用法: (1)、switch URL [PATH] (2)、switch –relocate FROM TO [PATH...] (1)、更新你的工做副本,映射到一個新的URL,其行爲跟「svn update」很像,也會將服務器上文件與本地文件合併。這是將工做副本對應到同一倉庫中某個分支或者標記的方法。 (2)、改寫工做副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變更(好比方案名或是主機名稱變更),可是工做副本仍舊對映到同一倉庫的同一目錄時使用這個命令更新工做副本與倉庫的對應關係。
1七、解決衝突
svn resolved: 移除工做副本的目錄或文件的「衝突」狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決衝突或是移除衝突標記;它只是移除衝突的相關文件,而後讓 PATH 能夠再次提交。
1八、輸出指定文件或URL的內容
svn cat 目標[@版本]…若是指定了版本,將從指定的版本開始查找。 svn cat -r PREV filename > filename (PREV 是上一版本,也能夠寫具體版本號,這樣輸出結果是能夠提交的)
本文部份內容是參考網上資源,由博主@Lx整理。
原創文章,轉載請備註原文地址 http://www.cnblogs.com/lxmhhy/p/6044054.html