Git & SVN
Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
SVN(Subversion) 是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理。
对比
架构 | 上手难度 | 分支 | |
---|---|---|---|
Git | 分布式 | 功能多,概念复杂 | 指向某一次提交 |
SVN | 集中式 | 容易上手 | 复制整个目录 |
Git
Git Submodule
SVN
安装服务端
shell
sudo pacman -S subversion
创建仓库
shell
svnadmin create [仓库路径]
配置访问账号密码
SVN 仓库的配置在仓库路径下的
conf/svnserve.conf
文件里
取消 password-db
注释,并修改密码数据文件位置,相对位置为 conf 目录下。
创建对应的文件并修改其内容:vim conf/passwd
properties
[users]
wen = 123456
配置 SVN 服务
vim /etc/conf.d/svnserve
sh
SVNSERVE_ARGS="-r /home/wen/workspace/svn-repo-1"
# 默认使用 3690 端口,可添加 --listen-port 选项修改
启动服务
sudo systemctl start svnserve
安装客户端
可用 SVN 客户端
shell
svn checkout svn://localhost test-svn
cd test-svn
touch README.md # 在目录中创建文件
mkdir dir1 dir2
svn add README.md dir1 dir2
svn commit --message '测试提交 | Test Commit' # 提交添加的所有文件和目录
vim README.md # 修改文件,添加任意内容
svn status # 可以当前添加和修改状态
svn commit --message '添加内容'
svn log README.md # 查看 README.md 文件修改记录
vim README.md # 任意修改文件
svn revert README.md # 撤销修改
SVN 常用命令
签出(checkout)
shell
svn checkout URL[@REV]... [PATH]
# 支持选项
# --depth ARG : 限制操作深度是 ARG ('empty', 'files', 'immediates', 或 'infinity')
# empty:空目录,什么也不复制过来
# files:只复制目录里的文件
# immediates:复制目录里的子目录和文件,但是递归复制子目录内的文件
# infinity:递归复制所有文件
忽略文件(svg:ignore)
SVN 忽略文件使用的是目录属性来配置的
修改当前目录的忽略文件或者目录:svn propedit svg:ignore .
支持通配符
分支和标签
SVN 一般情况下使用 trunk
、tags
、branches
三个目录分别表示主干、标签、分支。
创建分支
shell
cd trunk
touch main.cpp
svn add main.cpp
svn commit -m '初始化'
svn copy . ../branches/dev_feature -m '创建新分支'
修改 main.cpp
c++
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
shell
svn commit -m '完成 Hello Wrold!'
合并分支到主干
NOTE
合并分支前最好将主干和分支都 update
一次,确保都是最新的状态
shell
cd trunk
svn merge ../branches/dev_feature
将版本 N 的内容合并到最新版本
shell
svn merge -c -R HEAD:N .
恢复到指定版本
shell
svn update -r N