# Subversion

# Flag

按装VisualSVN后客户端使用报错:执行上下文错误: 由于目标计算机积极拒绝,无法连接。,需要在服务列表中找到相关服务 -> 右键打开属性 -> 点击登录页签修改登录身份本地系统账户 -> 点击常规页签修改启动类型自启动,再点击启动

# SVN不同分支,进行比对
svn diff -r 1100:1323
# 获取所有SVN提交作者用户名的列表
# https://stackoverflow.com/questions/2494984/how-to-get-a-list-of-all-subversion-commit-author-usernames
svn log --quiet | awk '/^r/ {print $3}' | sort | uniq
svn log --quiet | grep "^r" | awk '{print $3}' | sort | uniq

选中要比对的一个分支,Shift+右键+选中TorsoiseSVN -> diff with url,然后填入另外一个要比对的分支url即可

统计文件夹大小

只看一级:--depth immediates

([xml](svn list --xml --recursive <仓库URL>)).lists.list.entry | Where-Object { $_.kind -eq 'file' } | Measure-Object -Sum size | Select-Object Count, Sum

([xml](svn ls --xml -R "<仓库URL>")).lists.list.entry | Where-Object { $_.kind -eq 'file' } | Measure-Object -Property size -Sum | ForEach-Object { "总大小: {0:N2} MB" -f ($_.Sum / 1MB) }

(([xml](svn list --xml -R <仓库URL>)).lists.list.entry | Where-Object { $_.kind -eq 'file' } | Measure-Object -Property size -Sum).Sum | Write-Host "$_ 字节"

# 逐个子目录递归并汇总大小
$url='<仓库URL>'; ((svn list --depth immediates $url) | ForEach-Object { if ($_ -match '/$') { $sub = "$url/$_".TrimEnd('/'); ([xml](svn list --xml -R $sub)).lists.list.entry | Where-Object kind -eq 'file' | Measure-Object size -Sum | % Sum } else { $f = $_ -replace '\s+$',''; ([xml](svn info --xml "$url/$f")).info.entry.size } }) | Measure-Object -Sum | % Sum | Write-Output
svn list --xml -R <仓库URL> \
  | xmllint --xpath 'sum(/lists/list/entry/size) div 1024 div 1024 div 1024' - \
  | xargs printf '%.2f GiB\n'

svn list --xml -R <仓库URL> | awk -F'[><]' '/<size>/{sum+=$3} END{printf "%.2f GiB\n", sum/1024/1024/1024}'

svn list --xml -R <仓库URL> | grep -oP 'kind="file" size="\K\d+' | awk '{s+=$1} END {print s " 字节"}'

svn list --xml -R <仓库URL> | xmlstarlet sel -t -v "//entry[@kind='file']/size" | awk '{s+=$1} END {print s " 字节"}'

svn ls --xml -R <仓库URL> | grep -oP '(?<=<size>)[0-9]+' | awk '{sum+=$1} END {print "总大小: " sum/1024/1024 " MB"}'

svn list -v -R <仓库URL> > listing.txt

svn list -vR <仓库URL> | awk '$3 ~ /^[0-9]+$/ {sum+=$3; n++} END{printf "文件数=%d  总大小=%.2f MiB\n", n, sum/1024/1024}'

# 逐个子目录递归并汇总大小
url='<仓库URL>'; sum=0; while IFS= read -r line; do if [[ $line =~ /$ ]]; then size=$(svn list --xml -R "$url/$line" | grep -oP 'kind="file" size="\K\d+' | awk '{s+=$1} END{print s}'); sum=$((sum + ${size:-0})); else f="${line%%[[:space:]]}"; size=$(svn info --xml "$url/$f" | grep -oP 'size="\K\d+' | head -1); sum=$((sum + ${size:-0})); fi; done < <(svn list --depth immediates "$url"); echo "$sum"

# Linux安装

# 检查已安装
rpm -qa subversion
# 安装
yum -y install subversion
# 查看已安装版本
svnserve --version

创建代码库

# 建立SVN版本库目录
mkdir -p /home/svn/svnrepos/test
# 创建SVN版本库
svnadmin create /home/svn/svnrepos/test

执行上面的命令后,自动建立svndata库, /home/svn/svnrepos/test文件夹包含了confdbformathookslocksREADME.txt等文件,说明一个SVN库已经建立。

配置代码库

# 进入`conf`文件夹
cd /home/svn/svnrepos/test/conf
# 配置用户密码`passwd`
vi passwd
  • [users]节点下添加以下内容(账户=密码)
# 账户=密码
bajins.com=bajins.com
  • 配置权限控制authz
vi authz

目的是设置哪些用户可以访问哪些目录,向authz文件末尾追加以下内容:

设置[/]代表根目录下所有的资源,rw为读和写,*代表所有用户,先按shift+g跳到末尾,然后添加

[/]
bajins.com=rw
*=r
  • 配置服务svnserve.conf
vi svnserve.conf

[general]节点下追加以下内容

# 匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
# 使授权用户有写权限
auth-access=write
# 密码数据库的路径
password-db=passwd
# 访问控制文件
authz-db=authz
# 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm = This Is A Repository

如果需要创建多个库就需要重复做上面2、3步,并且最后一个目录名是不一样的

  • 建立第2个SVN版本库目录
mkdir -p /home/svn/svnrepos/test2
  • 创建第2个SVN版本库
svnadmin create /home/svn/svnrepos/test2

启动

svnserve -d -r /home/svn/svnrepos/
# 查看SVN进程
ps -ef|grep svn
# 检测SVN端口
netstat -antlp|grep svnserve
# 放开端口
firewall-cmd --zone=public --add-port=3690/tcp --permanent
firewall-cmd --reload

连接地址:svn://host:port/仓库名

停止SVN

# 查找svnserve进程(PID)
ps -aux | grep svnserve
# 结束进程
kill -9 PID
#或者
killall svnserve