整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Coding的SVN服务踩坑记

Coding的SVN服务踩坑记

Q:咳咳,为啥会用到Coding的SVN?

A:博主电脑上已经配好一个coding的账号,且是全局的。网上搜索一台电脑上配置两个git账号都是采用非全区的账号的方法。这个coding是博主的第二个coding账号,全局的账号不想动他。于是尝试下Coding的SVN服务。

食用方式

在项目的仓库设置>开启SVN服务,蓝后去下载小乌龟TortoiseSVN。不要点击下面这个,这个是服务器端的。一开始不清楚,踩一个坑

不要下载这个!!

去下载小乌龟tortoisesvn.net/downloads.html

安装

打开这个,SVN输入地址(Coding上有)

输入Coding账号

登录后就可以看到仓库内容了。

蓝后直接把需要部署的代码移进去

后续

想覆盖文件,报错。

想删除文件,报错。

由于SVN不是很会用,这两个坑踩的我一脸懵逼。让后脑子终于开窍,想到了更好的解决小号coding代码推送的方法。于是弃用SVN了233333~

关注关注求关注

ortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。

一、安装SVN客户端

首先安装SVN客户端,windows一般选择乌龟客户端:https://tortoisesvn.net/downloads.html。 根据系统位数选择相应客户端进行安装。

二、获取仓库代码

假如项目已经在服务器的仓库里,那么现在你要做的就是把它检出到本地。 首先创建一个空文件夹,用来存放项目源代码。在空文件夹内右键,选择SVN检出(SVN Checkout ...)菜单项。

在Checkout界面,填入项目的版本库地址,选择确定。

此时会弹出一个对话框让你输入账号密码,输入你的账号密码即可。记得勾选保存认证,不然每次操作都会让你输入。

此时在指定的目录下就能看到checkout下来的项目代码了。

SVN的修订号是怎么回事?

svn commit 操作可以作为一个原子事务操作发布任意数量文件和目录的修改。在你的工作副本中,你可以改变文件内容,创建、删除、改名和复制文件和目录,然后作为一个整体提交。

在版本库中,每次提交被当作一次原子事务操作:要么所有的改变发生,要么都不发生,Subversion 努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。每当版本库接受了一个提交,文件系统进入了一个新的状态,叫做版本,每个版本被赋予一个独一无二的自然数,一个比一个大,初始修订号是 0,只创建了一个空目录,没有任何内容。

可以形象的把版本库(Repository)看作一系列树,想象有一组版本号,从 0 开始,从左到右,每一个修订号有一个目录树挂在它下面,每一个树好像是一次提交后的版本库“快照”。

不像其它版本控制系统,Subversion 的版本号是针对整个目录树的,而不是单个文件。每一个版本号代表了一次提交后版本库整个目录树的特定状态,另一种理解是版本 N 代表版本库已经经过了 N 次提交。

如何查看SVN上当前代码库的最新版本号是多少?

打开右键菜单中的show log,然后看到一系列版本更新历史,最上面的那一行,即是最新版本号,所谓的head revision。

如何查看本地SVN管理的代码库的当前版本号是多少?

打开右键菜单中的show log,然后看到一系列版本更新历史,显示为粗体的那一行即你本地当前的版本。

如何将本地代码库的版本回退到某一个旧版本?

打开右键菜单中的update to revision 在弹出的对话框中进行版本号指定即可,如果选择head revision则更新为最新版本。

三、提交代码到仓库

如果你更新了目录中的文件,提交代码需要用到commit功能,commit的功能不仅仅是上传,他会和服务器上面的文件进行对比,假如你更新了某个文件而服务器上面也有人更新了这个文件,并且是在你checkout之后做的更新,那么它会尝试将你的更新和他人的更新进行融合(merge),假如自动merge不成功,那么报告conflict,你必须自己来手动merge,也就是把你的更新和别人的更新无冲突的写在一起。

commit的时候,最好填写Log信息,这样保证别人可以看到你的更新究竟做了写什么。这就相当于上传文件并且说明自己做了那些修改,多人合作的时候log非常重要。

TortoiseSVN的commit只会上传原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右键点击文件选择Add,然后文件上面会出现一个加号,在下次commit的时候它就会被upload并且被标记为绿色对勾。没有绿色对勾的文件不会被commit。

TortoiseSVN图标不能显示的解决方案?

右键->TortoiseSVN->setting->Icon Overlays->Status cache->default/Shell,然后重启电脑。

TortoiseSVN的Settings窗口:

我们在日常使用中,最常用的是更新(SVN Update)和提交(SVN Commit)操作。这两个步骤务必要非常熟练。

. 现象

  • SVN结构
  • SVN主目录: /svn/repos
  • SVN配置文件: /svn/etc

2. 原因分析

SVN数据与用户备份

hotcopy 与 dump

  • Hotcopy直接复制存储库。 它速度很快,但它保留了底层文件系统等信息。 导入副本的服务器需要是相同的版本,具有相同的配置等
  • Dump是版本独立的。 这意味着导出的副本可以被任何版本的svn使用

Gzip压缩与xz压缩

  • Gzip压缩速度快,但是压缩比例没有xz高
  • xz压缩速度慢,但是压缩比例高

在考虑磁盘空间紧张,内存和CPU资源使用充足,可以使用xz压缩,压缩速度慢

在内存和CPU资源使用紧张,不考虑磁盘容量大小,建议使用gzip压缩,压缩速度快

3. 解决方法

3.1 备份策略

每一个月进行全量备份,每隔8个小时进行增量备份

3.2 备份准备

本地备份目录:/data/Backup/SVN

  • 赋予权限
  • 将目录/data以及子目录对其他用户添加可读、可执行的权限
  • 目录/data/Backup以及子目录添加对组backup可读、可写、可执行的权限
# 添加组backup
groupadd backup
# 添加用户cory到组backup
usermod -a -G backup cory
# 更改/data权限
chmod -R 775 /data
# 更改/data/Backup的用户组backup
chown -R root:backup /data/Backup

3.3 备份内容

  • 数据备份

将dump出来的文件进行备份

  • 配置文件备份
  • 认证文件、权限文件备份
  • SVNAdmin备份

iF.SVNAdmin管理界面备份

3.4 备份脚本

此版本只是基础版本,增量与全量备份未写在其中,请知悉

#!/usr/bin/env bash
# TODO: Bup备份
# TODO: 其他备份目录
# TODO: 软编码 IP 等
# TODO: 定期删除
# TODO: 模块编码
# TODO: 增量备份与全量备份
set -e
password=$1
repo_dir="/svn/repos"
backup_dir="/data/Backup/SVN"
svnadmin="/usr/bin/svnadmin"
svnlook="/usr/bin/svnlook"
name=$(basename "$repo_dir")
revision=$($svnlook youngest "$repo_dir")
target="$backup_dir/$name-$revision.xz"
echo "$name-$revision.xz" > $backup_dir/currentBackup.info

if [ ! -e "$target" ]; then
    rm -f "$backup_dir/$name"-*.xz
    # nice $svnadmin dump -r $((revision_full + 1)):${latest_revision} --incremental --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
    # nice $svnadmin dump --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
    nice $svnadmin dump --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
fi

# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" $backup_dir/currentBackup.info sailingadmin@192.168.10.11:/data/SVN/
# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" "$target" sailingadmin@192.168.10.11:/data/SVN/
# sync etc
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /svn/etc sailingadmin@192.168.10.11:/data/SVN/
# sync svnadmin
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /var/www/html/svnadmin sailingadmin@192.168.10.11:/data/SVN/
# delete
rm -rf $backup_dir/currentBackup.info
rm -rf "$target"

3.5 定期删除备份文件

将备份在192.168.10.11目录的过期文件定期删除

通过Linux Crontab或者Jenkins都可以,如Crontab

#!/usr/bin/env bash
# TODO: Bup备份
# TODO: 其他备份目录
# TODO: 软编码 IP 等
# TODO: 定期删除
set -e
password=$1
repo_dir="/svn/repos"
backup_dir="/data/Backup/SVN"
svnadmin="/usr/bin/svnadmin"
svnlook="/usr/bin/svnlook"
name=$(basename "$repo_dir")
revision=$($svnlook youngest "$repo_dir")
target="$backup_dir/$name-$revision.xz"
echo "$name-$revision.xz" > $backup_dir/currentBackup.info

if [ ! -e "$target" ]; then
    rm -f "$backup_dir/$name"-*.xz
    # nice $svnadmin dump -r $((revision_full + 1)):${latest_revision} --incremental --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
    # nice $svnadmin dump --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
    nice $svnadmin dump --deltas --quiet "$repo_dir" | xz -T 0 --compress --stdout -9 --extreme > "$target"
fi

# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" $backup_dir/currentBackup.info sailingadmin@192.168.10.11:/data/SVN/
# sync data
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" "$target" sailingadmin@192.168.10.11:/data/SVN/
# sync etc
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /svn/etc sailingadmin@192.168.10.11:/data/SVN/
# sync svnadmin
sshpass -p "${password}" rsync -arvP -e "ssh -p 22222" /var/www/html/svnadmin sailingadmin@192.168.10.11:/data/SVN/
# delete
rm -rf $backup_dir/currentBackup.info
rm -rf "$target"

3.6 还原

准备文件

  • 全量备份文件:repos-5083-Full.xz
  • 增量备份文件:repos-5098-Inc.xz
  • 其他其他备份文件:etc配置权限文件、svnadmin界面文件

1) SVN安装

Centos 7 安装 SVN

  • Apache安装
crontab -e
# 每隔两天删除备份文件
# 删除除当前备份文件(从currentBackup.info读取)以外的其他压缩文件
# * * */2 * * cd /data/SVN && ls *.xz | grep -v $(cat currentBackup.info) | xargs rm -rf
  • 去除apache默认欢迎界面
sudo sed -i 's/^/#&/g' /etc/httpd/conf.d/welcome.conf
  • 阻止显示/var/www/html目录
sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/httpd/conf/httpd.conf
  • 安装SVN和mod_dav_svn模块
sudo yum install -y subversion mod_dav_svn

2) SVN配置

  • 更改配置文件
sudo vi /etc/httpd/conf.modules.d/10-subversion.conf

最终内容如下:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule dontdothat_module modules/mod_dontdothat.so
<Location /svn>
DAV svn
SVNParentPath /data/SVN
AuthName "SVN Repos"
AuthType Basic
AuthUserFile /etc/svn/svn-auth
AuthzSVNAccessFile /etc/svn/authz
Require valid-user
</Location>
创建SVN Repo
sudo mkdir /data/SVN
cd /data/SVN
sudo svnadmin create repos
sudo chown -R apache:apache repos

3) 还原Restore

解压全量备份包和增量备份包

sudo xz -d -T 0 repos-5083-Full.xz
sudo xz -d -k -T 0 repos-5098-Inc.xz

依次导入解压出来的备份文件

sudo svnadmin load /data/SVN/repos < repos-5083-Full
sudo svnadmin load /data/SVN/repos < repos-5098-Inc

4)还原权限文件

拷贝备份文件到SVN安装时的配置文件路径地址:

# AuthUserFile /etc/svn/svn-auth
# AuthzSVNAccessFile /etc/svn/authz

sudo /etc/svn
sudo cp /data/etc/svn/authz /etc/svn/
sudo cp /data/etc/svn/svn-auth /etc/svn/
sudo chown -R root:apache /etc/svn/
sudo chmod -R 670 /etc/svn/

5) 开启apache并修改防火墙

sudo systemctl start httpd.service
sudo systemctl enable httpd.service
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --reload

确认已恢复到到对应Revision:5098

6) iF.SVNAdmin管理界面还原

拷贝svnadmin备份文件到/var/www/html中

sudo cp -rf /data/svnadmin /var/www/html/
sudo chmod -R 777 /var/www/html/svnadmin/data/
sudo chown -R apache:apache /var/www/html/svnadmin/

因为未安装php相关软件包,安装完成,重启即可

sudo yum install php
sudo systemctl restart httpd

3.7 验证

1)访问验证

SVN访问以及IF.Svnadmin管理界面访问

2)权限验证

3)节点Revision还原验证