首页  > 知识速递  > 

Linux环境下部署svn服务详解(svn切换账号登录)

  • 浏览5425次
  • lengsiwei.com
  • 评论0条
  • 导读说明环境:操作系统:centos 8.0IP:39.100.228.13安装用ROOT账号登录,在控制台执行以下命令,一直默认安装就好可以了。[root@localhost ~]#yum install svn 输入svnserve --v...

    说明

    环境:操作系统:centos 8.0IP:39.100.228.13

    安装

    用ROOT账号登录,在控制台执行以下命令,一直默认安装就好可以了。

    [root@localhost ~]#yum install svn
    Linux环境下部署svn服务详解

    输入svnserve --version 查看安装信息

    Linux环境下部署svn服务详解

    这里可以看到版本是1.10.2

    配置

    创建目录和版本库

    [root@qinshengfei ~]# mkdir -p /home/svn

    -p是递归创建多级目录

    输入 svnadmin create /home/svn/project 创建版本库

    [root@qinshengfei ~]# svnadmin create /home/svn/project

    进入/home/svn/project目录,我们可以看到以下几个文件及文件夹:

    配置用户访问权限 切换进conf目录

     [root@qinshengfei project]#cd conf
    Linux环境下部署svn服务详解

    authz 配置用户、用户组读写权限

    passwd配置用户、用户组密码

    svnserve.conf配置svn相关服务参数

    配置passwd文件

    在文件里添加一行shelton=123456,shelton是账号名,123456是密码

    配置authz文件

    在文件里添加两行:

    [] 表示根目录

    shelton=rw 设备shelton账号的权限读写

    配置svnserve.conf

    配置信息解释如下:

    #匿名访问的权限,可以是read,write,none,默认为read

    anon-access=none

    #使授权用户有写权限

    auth-access=write

    #密码数据库的路径

    password-db=passwd

    #访问控制文件

    authz-db=authz

    #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字

    realm=/home/svn/project

    Linux环境下部署svn服务详解

    启动

     [root@qinshengfei ~]#svnserve -d -r /home/svn/project

    查看是否启动有进程

    连接测试

    我们以windows为例,在我们的电脑的安装好tortoisesvn

    tortoisesvn地址:https://tortoisesvn.net/

    我们新建一个文件夹叫:project用来同步svn文件

    先连接svn服务器

    输入账号和密码

    Linux环境下部署svn服务详解

    当出现这样一个框时,说明svn已经同步连上svn服务器了

    Linux环境下部署svn服务详解

    总结

    在云服务器上部署svn服务,需要在云主机的安全配置里开通3690端口

    连接svn服务器,先配置好账号、密码相关权限等

    一篇搞懂Git 和 SVN 的区别

    前言

    Git和SVN都是版本管理系统,但是他们
    命令区别后面会简单进行一个对比,我们先从原理的角度分析


    git和svn命令

    先来复习哈命令

    作用

    git

    svn

    版本库初始化

    git init

    svn create

    clone

    git clone

    svn co(checkout)

    add

    git add (.除去.gitignore,*所有的文件)

    svn add

    commit

    git commit

    svn commit

    pull

    git pull

    svn update

    push

    git push

    -

    查看工作状态

    git status

    svn status

    创建分支

    git branch <分支名>

    svn cp <分支名>

    删除分支

    git branch -d <分支名>

    svn rm <分支名>

    分支合并

    git merge <分支名>

    svn merge <分支名>

    工作区差异

    git differ (-cached / head)

    svn diff

    更新至历史版本

    git checkout <commit>

    svn update -r <rev>

    切换tag

    git checkout <tag>

    svn switch <tag>

    切换分支

    git checkout branch

    svn switch branch

    还原文件

    git checkout - path

    svn revert path

    删除文件

    git rm path

    svn rm path

    移动文件

    git mv path

    git mv path

    清除未追踪文件

    git clean

    svn status sed -e



    1.存贮区别

    大家想想为什么我们代码管理为什么一般用git,原型和高保真管理一般用SVN?

    1.git是分布式的,有本地和远程两个版本库,SVN是集中式,只有一个远程版本库;
    2.git的内容是按元数据方式存贮,所有控制文件在.git中,svn是按文件处理,所有资源控制文件在.svn中;
    3.svn的分支是一个目录,git不是;
    4.git没有一个全局的版本号,svn有;
    5.git内容存贮是使用SHA-1哈希算法,能确保代码完整性;
    6.git 有工作区,暂存区,远程仓库,git add将代码提交到暂存区, commit提交到本地版本库,push推送到远程版本库。svn是add 提交到暂存,commit是提交到远程版本库。

    一篇搞懂Git 和 SVN 的区别

    所以可以很清楚的看出因为原型和高保真都是以单个文件为单位,所以适合用SVN管理,而我们代码时以行数为单位,适合Git


    2.文件.svn和.git区别

    1..svn目录

    随便打开一个.svn的目录可以看到结构:
    如果无法查看.svn,window电脑-点击查看-勾选隐藏文件;
    mac直接shift + command + .

    ├── pristine 各个版本纪录,这个文件一般较大├── tmp ├── entries 当前版本号├── format 文本文件, 放了一个整数,当前版本号├── wc.db 二进制文件├── wc.db-journal 二进制文件

    2..git 目录结构

    你可能对这些目录结构很陌生,没关系,直接在终端输入 git help gitrepository-layout回车,你会发现浏览器会打开一个html文件,实际上就会打开安装git下面的一个html文档

    ├── hooks 钩子文件│   ├── lypatch-msg.sample│   ├── commit-msg.sample│   ├── fsmonitor-watchman.sample│   ├── fsmonitor-watchman.sample│   ├── pre-lypatch.sample│   ├── pre-commit.sample commit时会触发这个钩子│   ├── pre-push.sample push触发│   ├── pre-rebase.sample│   ├── pre-receive.sample│   ├── prepare-commit-msg.sample│   ├── update.sample update触发├── info│   ├── exclude 忽略的文件├── object git数据对象,包括commit,trees,二进制对象,标签等├── COMMIT_EDITMSG 上一次提交的注释信息├── log 各个refs的历史信息├── refs 每个分支指向那个提交├── config 本项目配置信息,包括仓库地址,分支,用户账号等├── description 项目描述├── HEAD 当前分支的最后一次提交├── index 索引文件,存贮git add把要添加的项├── packed-refs 分支标识文件

    所以可以看出git在处理代码方面功能比svn要强大一些


    3..git文件动态分析

    3.1 add阶段

    1.执行git init会生成一个初始化的.git,会发现上面有些目录文件没有,因为有些文件是指定的命令后才会生成

    2.新建一个test.txt,随便写点内容,执行git status

    On branch master  // 默认一个master 分支No commits yetUntracked files: // 未提交的文件  (use "git add <file>..." to include in what will be committed)    test.txtnothing added to commit but untracked files present (use "git add" to track)

    运行 find . -type f

    ./config./HEAD./info/exclude./description./hooks/commit-msg.sample./hooks/pre-rebase.sample./hooks/pre-commit.sample./hooks/lypatch-msg.sample./hooks/fsmonitor-watchman.sample./hooks/pre-receive.sample./hooks/prepare-commit-msg.sample./hooks/post-update.sample./hooks/pre-lypatch.sample./hooks/pre-push.sample./hooks/update.sample./index

    3.执行 git add text.txt,显示

    On branch masterNo commits yetChanges to be committed:  (use "git rm --cached <file>..." to unstage)    new file:   test.txt

    运行find . -type f

    ./config./objects/61/de0edff4ebeeff225da34006cbe6427638fadc  # 比之前多了一个文件./HEAD./info/exclude./description./hooks/commit-msg.sample./hooks/pre-rebase.sample./hooks/pre-commit.sample./hooks/lypatch-msg.sample./hooks/fsmonitor-watchman.sample./hooks/pre-receive.sample./hooks/prepare-commit-msg.sample./hooks/post-update.sample./hooks/pre-lypatch.sample./hooks/pre-push.sample./hooks/update.sample./index

    4.总结:可以看出git add后test.txt 被标记为staged 状态,而且object多了一个61/de0edff 文件,所以object 可以存贮git仓库内容,以二进制方式存贮。

    5.我们可以查看下文件

    git cat-file -p 61de0edf打印 test

    6.git如何管理和归档文件
    我们常见的文件系统(NTFS、FAT、FAT32)是基于地址方式检索文件,即先给具体的地址,然后从地址编号对应的存储单元读取文件内容,而git是基于内容检索,是对整个内容检索,得到一个真实的存储位置,类似哈希映射。

    3.2 commit阶段

    1.执行 git commit -m 'add test'

    1 file changed, 1 insertion(+)create mode 100644 test.txt

    2.运行 find . -type f

    ./test.txt./.git/config./.git/objects/61/de0edff4ebeeff225da34006cbe6427638fadc./.git/objects/ed/fd7e903f8f622f9a52542adfa077552608202d./.git/objects/26/ef8e81bc27b4a67f251145a4f83782364fa9fa./.git/HEAD./.git/info/exclude./.git/logs/HEAD./.git/logs/refs/heads/master./.git/description./.git/hooks/commit-msg.sample./.git/hooks/pre-rebase.sample./.git/hooks/pre-commit.sample./.git/hooks/lypatch-msg.sample./.git/hooks/fsmonitor-watchman.sample./.git/hooks/pre-receive.sample./.git/hooks/prepare-commit-msg.sample./.git/hooks/post-update.sample./.git/hooks/pre-lypatch.sample./.git/hooks/pre-push.sample./.git/hooks/update.sample./.git/refs/heads/master./.git/index./.git/COMMIT_EDITMSG

    可以看出commit 后在add 的基础上object多了两个文件ed/fd7e90和26/ef8e8,从文件的归档路径和命名可以看出git使用SHA-1算法对文件内容进行了

    还多了一个COMMIT_EDITMSG ,里面是上一次提交的注释信息

    3.使用git cat-file 查看

    git cat-file -t edfd7e90// 终端输出treegit cat-file -t 26ef8e8// 终端输出commitgit cat-file -p edfd7e90// 终端输出 100644 blob 61de0edff4ebeeff225da34006cbe6427638fadc    test.txtgit cat-file -p 26ef8e8// 终端输出 tree edfd7e903f8f622f9a52542adfa077552608202dauthor 信息  1612668900 +0800committer author 信息  1612668900 +0800

    ed/fd7e90 是一个commit 对象,tree属性指向了26/ef8e8,纪录了文件操作,作者,提交者信息;
    26/ef8e8 是一个tree 对象,blob 属性指向了blob对象61/de0edf,纪录了文件名;
    61/de0edf 是一个blob 对象,纪录了文件内容。

    三个文件关系:

    一篇搞懂Git 和 SVN 的区别


    所以现在知道为什么object文件会很大的吧

    3.3 branch

    git branch 获取分支列表
    列表保存到refs/heads/master 下面

    3.4 git对象模型

    通过上面3.2的分析知道,在git系统中有四种尅性的对象:
    1.commit:指向一个tree,纪录了文件操作,作者,提交者信息;
    2.tree:对象关系树,管理tree和blob的关系;
    3.blob:保存文件内容;
    4.tag:标记提交。

    3.5 git生命周期钩子

    1.钩子初始化:
    上面说到的hooks 下面都是生命周期脚本,初始化仓库(git init)或 git clone 都会初始化.git文件;

    2.钩子是本地的,因为不会提交到代码仓库,只不过clone的时候会初始化;

    3.钩子分类:

    钩子名

    作用

    pre-commit

    每次git commit之前会触发,很常见的应用就是在package.json结合husky和lint-staged做代码eslint

    prepare-commit-msg

    在pre-commit在文本器生成提交信息被调用,方便的修改自动生成的squash和merage提交

    commit-msg

    用户输入提交信息被调用,就是commit -m 后面那个提交信息,可以用来规范提交信息

    post-commit

    commit-msg后执行,通知git commit的结果

    post-checkout

    git checkout被调用

    pre-rebase

    git rebase 更改之前运行

    pre-receive

    git push后执行,存在于远程仓库中,服务端远程钩子

    update

    pre-receive 后调用

    post-receive

    push 推送成功后被调用,通知push的用户



    原文来自:https://segmentfault.com/a/1190000039978493

    基于windows平台的SVN教程

    作者:东风化宇 :https://www.flyne.org/article/851
    基于windows平台的SVN教程

    一、SVN工作原理

    SVN(SubVersion)的基本工作思路是这样的:在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序,由源代码库管理员统一管理这些源程序。

    每个用户在使用源代码库之前,首先要把源代码库里的项目文件到本地(Checkout),然后用户可以在本地任意修改,最后用svn命令进行提交(Commit),由svn源代码库统一管理修改。如下:

    基于windows平台的SVN教程

    SVN服务器:运行SubVersion服务的计算机,SubVersion支持Linux和Windows,更多的是安装在Linux下。SVN提供服务有两种方式(运行方式):独立服务器和借助Apache服务器,分别使用SVN协议和Http协议。

    SVN:用户通过SVN同SVN服务器打交道,SVN分为命令行工具和形化工具。最流行的是TortoiseSVN。也可以在Eclipse中使用SVN插件。

    基于windows平台的SVN教程

    二、SubVersion的使用

    可以在https://subversion.apache.org/packages.htmlSVN并安装(本文使用windows版本,过程不多说)。在SVN中集成了服务器端和组件:

    服务器组件(管理员用):svnadmin、svnserve

    组件(程序员用):svn

    这些组件命令都位于SubVersion安装目录下的bin目录下。

    友情提示:安装完SVN后,通过”svnadmin –version”验证是否安装成功。如果出现错误“svnadmin不是内部或外部命令”,则需要手动将SVN的bin目录加入到path环境变量下。

    1、创建SVN仓库

    1)先创建一个目录:E:svnreporepoDemo1。后面就使用该目录作为SVN仓库。

    2)创建仓库:svnadmin create E:svnreporepoDemo1。创建仓库后的目录结构如下:

    基于windows平台的SVN教程

    3)启动SVN服务:svnserve -d -r E:svnreporepoDemo1,如下:

    基于windows平台的SVN教程

    这样就启动了repoDemo1这个仓库的服务(单仓库),如果在svnrepo目录下还有其他仓库,且要同时启动多个仓库,执行svnserve -d -r E:svnrepo即可(多仓库)。

    一般情况下,访问SVN仓库的URL格式形如:svn://192.168.1.6/repoDemo1,但如果启动的是单仓库,则URL直接用:svn://192.168.1.6表示。svn协议的默认端口号为3690。

    小技巧:如果需要频繁使用该仓库,则可将该SVN服务注册成windows服务,这样在计算机开机时就可以启动该服务。如下:

    基于windows平台的SVN教程

    删除该windows服务:sc delete svnService。

    2、SVN操作(命令行)

    重点:checkout(检出)、commit(提交)、update(更新)

    1)在E盘下建立user1、user2两个目录,模拟两个协同工作的用户的workspace。

    2)检出:第一次和SVN服务器交互时,需要使用checkout将仓库检出到本地。

    基于windows平台的SVN教程

    说明:检出一次,就建立了与SVN仓库的连接。

    3)提交:commit

    在user1目录下新建Demo1.java文件,将该文件提交到SVN仓库。下演示了三种典型的错误提交。

    基于windows平台的SVN教程

    4)更新:update

    切换到user2的工作空间(user2目录下),user2第一次使用SVN仓库,需要检出。user2修改Demo1.java后提交。切换到user1目录,更新(update)。

    基于windows平台的SVN教程

    5)删除与恢复:delete、revert

    基于windows平台的SVN教程

    说明:如果delete后,提交到服务器(commit),则服务器上的数据也被删除了(慎用)。

    三、SVN的目录约定

    /trunck:开发主线

    /branches:支线副本

    /tags:标签副本(一旦创建,不允许修改)

    1)使用trunk作为主要的开发目录

    一般的,我们的所有的开发都是基于trunk进行开发,当一个版本(release)开发告一段落(开发、测试、文档、制作安装程序、打包等结束后),代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。

    当下一个版本/阶段的开发任务开始时,继续在trunk进行开发。此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。解决方法是基于发行版对应的tag,做相应的分支(branch)进行开发。

    2)下为struts2的SVN仓库目录:

    基于windows平台的SVN教程

    现在Struts2的代码使用git管理,所以现在查看Struts2的SVN仓库是空的。

    四、TortoiseSVN的使用

    TortoiseSVN是现在最流行的SVN工具,使用形化界面和SVN仓库交互(作为命令行方式的替代)。关于TortoiseSVN的安装省略。

    安装完成后,在任意位置右击都能看到TortoiseSVN选项。

    1、基本操作

    1)创建仓库

    创建目录:E:svnreporepoDemo2,进入该目录下,右击 — TortoiseSVN — Create repository here,并创建默认的SVN目录结构,如下所示:

    基于windows平台的SVN教程

    2)检出:checkout

    在E盘下建立user3、user4两个目录,模拟两个协同工作的用户的workspace。

    进入user3目录下,右击 — SVN Checkout,在URL of repository中输入:file:///E:/svnrepo/repoDemo2。【此时仓库还没有启动SVN服务,所以使用file://】

    基于windows平台的SVN教程

    3)提交:commit

    在user3/trunk目录下新建Demo1.java,在该文件上右击 — TortoiseSVN — add,则将Demo1.java纳入版本控制。然后右击 — SVN Commit,提交至代码仓库。

    4)更新:update

    对user4进行上面的检出操作。并修改user4目录下的Demo1.java(如增加一个字段),并commit。

    回到user3/trunk,右击 — SVN Update。

    5)启动SVN服务。这步需要在命令行中输入:svnserve -d -r E:svnrepo

    6)访问SVN仓库。在任意空白位置右击 — TortoiseSVN — Repo browser,URL输入:svn://192.168.1.6/repoDemo2即可浏览SVN仓库中的内容,如下。

    基于windows平台的SVN教程

    2、其他操作

    下面的操作都位于右键菜单的TortoiseSVN中。

    1)删除:delete

    删除文件或目录,不能直接用Windows的删除命令来操作,那样只是没有显示出来,实际并没有删除,在更新后,删除的文件又会被更新出来的。要想从库中删除,必须选中你要删除的内容,TortoiseSVN — delete,这样才会将这个文件标记成要删除的。确认需要删除后,使用前面所讲的提交命令,就会真正的在库中删除了。

    2)重命名:rename

    重命名也不能直接用Windows的重命名命令来操作,必须选中你要重命名的文件,TortoiseSVN — rename。修改后提交就可以更新到仓库。

    改名的处理方式相当于新增了一个以新名称命名的文件,原名称命名的文件进行了删除。

    3)还原:revert

    在未提交之前,你对前面做的操作反悔了,可以使用revert来恢复。

    4)检查更新:Check for modifications

    ① 此功能可以显示你所做的修改有哪些还没有提交的。② 还可以看到版本库里的改动,即别人提交了哪些文件的改动,你还没更新到本地。

    5)导出:export

    使用SVN的工作空间每个目录下面都有一个.svn隐藏目录,利用SVN的export命令可轻松地导出不含.svn目录的工作空间。

    3、冲突问题的解决(☆)

    何时发生:接着4.1节中的操作,假设user3和user4目录下的Demo1.java都更新到了最新版本。user3修改Demo1.java,提交至仓库。若user4也修改Demo1.java并提交,此时user4的TortoiseSVN会报提交版本过时的错误,并提醒user4需要更新,更新时就会发生冲突。如下:

    基于windows平台的SVN教程

    对于每个更新冲突的文件,Subversion会在冲突文件所在目录下放置了三个文件:

    Demo1.java.mine:发生冲突时的本地版本。

    Demo1.java.r3:最后更新之后的本地版本。

    Demo1.java.r4:仓库中的最新版本。

    解决方法 1:

    ① 在Demo1.java上右击 — TortoiseSVN — Edit conflicts,这时你需要确定哪些代码是需要的,做一些必要的修改然后保存。小技巧:冲突时,可使用直接复制需要的代码到Merged窗口即可。

    ② 完成后保存,直接选择Mark as resolved,即标记为冲突已解决。退出冲突窗口,发现冲突发生时生成的三个文件被自动删除了,且Demo1.java变成了未提交状态。

    基于windows平台的SVN教程

    ③ commit,OK。

    解决方法 2:

    直接修改Demo1.java,把其中的一些标记删除即可(前提是服务器上的和本地的内容都需要保存)。

    4、TortoiseSVN标

    基于windows平台的SVN教程

    部分标的说明:

    normal:状态正常

    modified:对本地的副本做了修改,需要提交到服务器

    conflicted:有冲突

    readonly:文件是只读的,要修改必须先获取锁

    locked:获得锁

    deleted:计划从版本库中删除

    added:已被计划纳入版本控制

    non-versioned:未纳入版本控制

    5、认证与授权

    所谓认证(Authentication),就是给使用该仓库的用户分配一个用户名和密码,用户在连接仓库的时候需要输入用户名/密码。授权(Authorization)就是为指定用户分配特定的权限,如只读、读写等。认证与授权的设置需要修改仓库conf目录下的文件,如下:

    authz:认证文件,分配用户名、密码。

    passwd:授权文件,为现有用户分配组,并为组分配权限。

    svnserve.conf:指定认证、授权文件的位置。

    1)修改conf/svnserve.conf

    基于windows平台的SVN教程

    2)修改conf/passwd

    基于windows平台的SVN教程

    3)修改conf/authz

    基于windows平台的SVN教程

    这样,当用户再次执行checkout、commit、update时,就会要求认证。

    五、subclipse插件的使用

    Eclipse提供了集成SVN的插件 — subclipse,本文重点subclipse的使用。Eclipse中插件的安装不是这儿的重点。安装成功后,可以看到下面的视(Windows — Show View)和透视(Windows — Open Perspective):

    基于windows平台的SVN教程

    下面的操作使用了4.1节中的资源库(repoDemo2)。

    1)关联资源库

    进入SVN资源库研究透视,在SVN资源库面板上右键 — 新建 — 资源库位置,URL中输入:svn://192.168.1.6/repoDemo2。

    2)共享项目:share Project

    新建一个Java Project,名称为svnProject,在项目中新建一个Demo1.java。

    共享项目:在项目上右键 — Team — Share Project…,将项目导入到repoDemo2。在输入文件夹名时,一般选择使用项目名称作为文件夹名。

    3)提交:Commit

    共享之后,项目并没有提交到仓库中,此时在项目上右键 — Team — Commit,就可以将现在的项目提交到仓库中。

    4)检出:Checkout

    新建一个workspace,模拟另外一个用户(user2)。首先还是关联资源库,在svnProject上右键 — 检出为。

    基于windows平台的SVN教程

    在Demo1.java中新增一个字段并提交(在user2的workspace中做的)。

    5)更新:

    切换到user1的工作空间,更新项目。不多说,Team — update

    6)冲突处理

    冲突的产生见4.3节。原则:提交之前先更新。

    4.3节中的两种解决方法也适用于subclipse,解决方法1对应着subclipse中的Synchronize视(View),解决方法2类同。

    六、SVN与Apache整合(用到再看)

    业务场景:在上面的Demo中,SVN仓库对外提供服务都是通过SVN协议,最直观的体现就是URL都是以svn://开头的。在开源项目中使用的SVN仓库对外提供服务时都是使用http协议,此时需要结合Apache服务器。

    1)安装Apache服务器(假定安装在C:Apache2.2)

    2)修改C:Apache2.2confhttpd.conf释放掉注释和增加红色边框的两行(有顺序要求)

    基于windows平台的SVN教程

    3)从SVN安装目录的bin目录下,拷贝mod_authz_svn.so和mod_dav_svn.so到C:Apache2.2modules目录中

    4)用Apache服务器的htpasswd创建密码文件

    基于windows平台的SVN教程

    5)拷贝project1_password到E:repositorysvnproject1conf目录下

    6)拷贝以下内容到Apacheconfhttpd.conf最后

    基于windows平台的SVN教程

    7)访问https://localhost/svn/flyne/trunk即可访问SVN仓库。

    Tequilasunr