Linux subversion 相关配置、服务启动与客户端操作

安装: yum install -y subversion
默认加载的配置文件为: /etc/sysconfig/svnserve
配置格式为:OPTIONS="--root /data/svn_data/"
Tips:-r [--root] 是指定运行的目录,需要以"/"结束

创建版本库之后相关文件与配置文件说明:

conf/ # 配置目录
├── authz # 权限配置,注意空格;相关配置:目录;组名=组员;用户名=读写权限;组名=读写权限;*= 未配置的访问
├── passwd # 用户配置,注意空格; 格式:用户名=密码 
└── svnserve.conf # 版本库配置,注意空格
db # 版本数据
format # 未知
hooks/ # 钩子脚本目录
├── post-commit.tmpl # 提交成功
├── post-lock.tmpl # 提交锁定
├── post-revprop-change.tmpl # 
├── post-unlock.tmpl # 提交解锁
├── pre-commit.tmpl # 
├── pre-lock.tmpl # 
├── pre-revprop-change.tmpl # 
├── pre-unlock.tmpl # 
└── start-commit.tmpl # 开始提交
locks # 未知
README.txt # 相关说明

具体配置参数可查看 svnserve --help

常用操作:
svn --help 查看帮助
svn help commond 查看指定命令的帮助信息

1. svn info #显示当前工作目录的信息
2. svn list  #显示当前工作目录中通过版本管理的文件,
  -v:每个文件或目录的详细信息,各字段含义
    版本号 用户 文件大小 修改时间 对应的文件
3. svn cat -r 版本号 文件 # 显示指定版本的文件内容
4. svn log # 显示日志
  svn log -r r1:r2 # 显示两个指定版本的日志
  svn log file # 显示指定文件日志,如果要是目录,则加 -v 参数
  svn log --limit N -v # 显示指定的记录条数
  问题: svn log 显示 no author、 no date
  解决:是在svnserve.conf 中开启了匿名配置即:anon-access的配置,关闭就好
5. svn diff 文件 # 显示以修改的差异
  svn diff -r 3 file # 显示本地文件与指定的版本号相差
  svn diff -r r1:r2 file # 指定的两个版本之间的差异
6. svn revert file # 还原当前修改的文件
7. svn commit -m "提交说明" file # 提交相应的文件到版本库
8. svn add file # 添加相应的file到版本库中,不提交
9. svn update -r r1 # 更新到指定版本,没有-r参数,则默认最新
10. svn resolve file # 标记冲突已解决
11. svn clean # 清除缓存垃圾
12. svn switch --relocate 旧地址 新地址 # 切换版本库的URL

管理员操作:

1. 导出
  svnadmin dump /svn/path/data > data.dump # 全量导出
  svnadmin dump -r r1:r2 --incremental > r1-r2-data.dump # 增量导出
2. 导入:前提是新库必需存在;所有导入的版本号必需是连续的,中间不能断的;
  svnadmin load /svn/path/ < data.dump
   2.1 如果被导入库的版本号与被导入文件的版本号可连接,如被导入库当前版本为10,而被导入文件为11到12版,则被导入库可正常被更新为12版;
   2.2 如果被导入库的版本号与被导入文件的版本号不可连接,如被导入库当前版本为10,而被导入文件为12到12版,则被导入库版本更新为11,本更新的文件为导入文件里的12版
   2.3 如果被导入库的版本号与被导入文件的版本号重叠,如被导入库当前版本为10,而被导入文件为10到12版,则被导入库版本更新为13,被导入文件里的第10号也被当作新的版本
3. 创建版本库
  # 创建版本库,地址: svn://host/版本库的realm名,注意此处使用的svn协议
  svnadmin create /svn/path

注意:SeLinux 关闭
启动: svnserve -d -r /svn/path 或者 systemctl start svnserve
默认的端口: 3690

firewall 防火墙:
  firewall-cmd --permanent --add-port=3690/tcp
  firewall-cmd --reload

附:init_svnserve 脚本

#!/bin/bash
#
# svnserve        Startup script for the Subversion svnserve daemon
#
# chkconfig: - 85 15
# description: The svnserve daemon allows access to Subversion repositories \
#              using the svn network protocol.
# processname: svnserve
# config: /etc/sysconfig/svnserve
# pidfile: /var/run/svnserve.pid
#
### BEGIN INIT INFO
# Provides: svnserve
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: start and stop the svnserve daemon
# Description: The svnserve daemon allows access to Subversion
#   repositories using the svn network protocol.
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions
# 加载配置文件,即启动配置文件
if [ -f /etc/sysconfig/svnserve ]; then
. /etc/sysconfig/svnserve
fi

exec=/usr/bin/svnserve
prog=svnserve
pidfile=${PIDFILE-/var/run/svnserve.pid}
lockfile=${LOCKFILE-/var/lock/subsys/svnserve}
# 启动参数
args="--daemon --pid-file=${pidfile} $OPTIONS"

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog

start() {
  [ -x $exec ] || exit 5
  [ -f $config ] || exit 6
  echo -n $"Starting $prog: "
  daemon --pidfile=${pidfile} $exec $args
  retval=$?
  echo
  if [ $retval -eq 0 ]; then
    touch $lockfile || retval=4
  fi
  return $retval
}

stop() {
  echo -n $"Stopping $prog: "
  killproc -p ${pidfile} $prog
  retval=$?
  echo
  [ $retval -eq 0 ] && rm -f $lockfile
  return $retval
}

restart() {
  stop
  start
}

reload() {
 restart
}

force_reload() {
  restart
}

rh_status() {
  # run checks to determine if the service is running or use generic status
  status -p ${pidfile} $prog
}

rh_status_q() {
  rh_status >/dev/null 2>&1
}

case "$1" in
  start)
    rh_status_q && exit 0
    $1
  ;;
  stop)
    rh_status_q || exit 0
    $1
    ;;
  restart)
    $1
  ;;
  reload)
    rh_status_q || exit 7
    $1
  ;;
  force-reload)
    force_reload
  ;;
  status)
    rh_status
  ;;
  condrestart|try-restart)
    rh_status_q || exit 0
    restart
  ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
    exit 2
  ;;
esac
exit $?