当前位置: 首页 > news >正文

61.SVN版本控制系统

SVN(Subversion)是一种集中式版本控制系统,它有一个中央仓库用于存储代码库的完整历史记录。相对于分布式版本控制系统(例如 Git),SVN 不支持本地仓库。

一、SVN 安装。

(1)在windows下安装 SVN

1、准备svn的安装文件

下载地址:Subversion for Windows download | SourceForge.net

2、下载完成后,在相应的盘符中会有一个Setup-Subversion-1.8.16.msi的文件,目前最新的版本是1.8.16, 这里就使用这个版本。然后双击安装文件进行安装。我们指定安装在D:\Program Files (x86)\Subversion目录里。

3、查看目录结构

把svn安装目录里的bin目录添加到path路径中,在命令行窗口中输入 svnserve --help ,查看安装正常与否。

至此,windows下的SVN安装完成


(2)在CentOS下安装 SVN

大多数 GNU/Linux 发行版系统自带了Subversion ,所以它很有可能已经安装在你的系统上了。可以使用下面命令检查是否安装了。

svn --version

如果 Subversion 客户端没有安装,命令将报告svn命令找不到的错误。

[runoob@centos6 ~]$ svn --version
bash: svn: command not found

我们可以使用 yum install subversion 命令进行安装。

[runoob@centos6 root]$ su -
密码:
[root@centos6 ~]# yum install subversion
已加载插件:fastestmirror, security
设置安装进程
Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* epel: mirrors.neusoft.edu.cn* extras: mirrors.zju.edu.cn* updates: mirrors.aliyun.com
解决依赖关系
--> 执行事务检查
...

安装成功之后,执行 svn --version 命令。

[root@centos6 ~]# svn --version
svn,版本 1.6.11 (r934486)编译于 Aug 17 2015,08:37:43

至此,centos下的SVN安装完成。


(3)在Ubuntu下安装 SVN

如果 Subversion 客户端没有安装,命令将报告svn命令找不到的错误。

root@runoob:~# svn --version
The program 'svn' is currently not installed. You can install it by typing:
apt-get install subversion

我们可以使用 apt-get 命令进行安装

root@runoob:~# apt-get install subversion
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:augeas-lenses hiera libaugeas0 libxslt1.1 ruby-augeas ruby-deep-merge ruby-json ruby-nokogiri ruby-rgen ruby-safe-yaml ruby-selinux ruby-shadow
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:libserf-1-1 libsvn1
...

安装成功之后,执行 svn --version 命令。

root@runoob:~# svn --version
svn, version 1.8.13 (r1667537)compiled Sep  8 2015, 14:59:01 on x86_64-pc-linux-gnu

至此,Ubuntu下的SVN安装完成。

二、SVN 生命周期。

本章讨论了版本控制系统的生命周期。


创建版本库

版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。

Create 操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。


检出

Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。


更新

顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。

让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。

此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。


执行变更

当检出之后,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件,例如进行文件的添加/删除操作。

你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。

同样地你可以删除文件/目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit 操作后才会真正删除。

Rename 操作可以更改文件/目录的名字。"移动"操作用来将文件/目录从一处移动到版本库中的另一处。


复查变化

当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。

Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status 操作就是用来查看这个待变更列表。

Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff 操作来查看这些变动的详细信息。


修复错误

我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。

Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。


解决冲突

合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,"hello.c" 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。


提交更改

Commit 操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。

在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。

三、SVN 启动模式(两种启动方式)。

首先,在服务端进行SVN版本库的相关配置

手动新建版本库目录(这里只是创建新的目录,跟svn没啥关系)

mkdir /opt/svn
或者直接创建好版本库的目录也是可以的
mkdir /opt/svn/runoob

利用svn命令创建版本库

svnadmin create /opt/svn/runoob

使用命令svnserve启动服务

svnserve -d -r 目录 --listen-port 端口号

由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式

方式一:-r直接指定到版本库(称之为单库svnserve方式)

svnserve -d -r /opt/svn/runoob

在这种情况下,一个svnserve只能为一个版本库工作。

authz配置文件中对版本库权限的配置应这样写:

[groups]
admin=user1
dev=user2
[/]
@admin=rw
user2=r

使用类似这样的URL:svn://192.168.0.1/ 即可访问runoob版本库

方式二:指定到版本库的上级目录(称之为多库svnserve方式)

svnserve -d -r /opt/svn

这种情况,一个svnserve可以为多个版本库工作

authz配置文件中对版本库权限的配置应这样写:

[groups]
admin=user1
dev=user2
[runoob:/]
@admin=rw
user2=r[runoob01:/]
@admin=rw
user2=r

如果此时你还用[/],则表示所有库的根目录,同理,[/src]表示所有库的根目录下的src目录。

使用类似这样的URL:svn://192.168.0.1/runoob 即可访问runoob版本库。

  • -r: 配置方式决定了版本库访问方式。

  • --listen-port: 指定SVN监听端口,不加此参数,SVN默认监听3690

四、SVN 创建版本库。

(1)创建版本库。 

使用 svn 命令创建资源库:

[runoob@centos6 ~]# svnadmin create /opt/svn/runoob01
[runoob@centos6 ~]# ll /opt/svn/runoob01/
total 24
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 conf
drwxr-sr-x 6 root root 4096 2016/08/23 16:31:06 db
-r--r--r-- 1 root root    2 2016/08/23 16:31:06 format
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 hooks
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 locks
-rw-r--r-- 1 root root  229 2016/08/23 16:31:06 README.txt

进入 /opt/svn/runoob01/conf 目录,修改默认配置文件配置,包括 svnserve.conf、passwd、authz 配置相关用户和权限。

1、svn 服务配置文件 svnserve.conf

svn 服务配置文件为版本库目录中的文件 conf/svnserve.conf。该文件仅由一个 [general] 配置段组成。

[general]
anon-access = none
auth-access = write
password-db = /home/svn/passwd
authz-db = /home/svn/authz
realm = tiku 
  • anon-access: 控制非鉴权用户访问版本库的权限,取值范围为 "write"、"read" 和 "none"。 即 "write" 为可读可写,"read" 为只读,"none" 表示无访问权限,默认值:read。

  • auth-access: 控制鉴权用户访问版本库的权限。取值范围为 "write"、"read" 和 "none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限,默认值:write。

  • authz-db: 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。 除非指定绝对路径,否则文件位置为相对conf目录的相对路径,默认值:authz。

  • realm: 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件。默认值:一个UUID(Universal Unique IDentifier,全局唯一标示)。

2、用户名口令文件 passwd

用户名口令文件由 svnserve.conf 的配置项 password-db 指定,默认为 conf 目录中的 passwd。该文件仅由一个 [users] 配置段组成。

[users] 配置段的配置行格式如下:

<用户名> = <口令>
[users]
admin = admin
thinker = 123456

3、权限配置文件

权限配置文件由 svnserve.conf 的配置项 authz-db 指定,默认为 conf 目录中的 authz。该配置文件由一个 [groups] 配置段和若干个版本库路径权限段组成。

[groups]配置段中配置行格式如下:

<用户组> = <用户列表>

版本库路径权限段的段名格式如下:

[<版本库名>:<路径>] 
[groups]
g_admin = admin,thinker[admintools:/]
@g_admin = rw
* =[test:/home/thinker]
thinker = rw
* = r

本例是使用 svnserve -d -r /opt/svn 以多库 svnserve 方式启动 SVN,所以 URL:svn://192.168.0.1/runoob01

(2)服务端配置svnserve.confi、password、authz文件。 

这几个文件初始状态都是注释的,需要把注释删除,前面的空格也要删除。 

修改 SVN 的配置文件需要按照特定的格式进行编辑。下面是对每个配置文件的简单说明以及如何进行修改的步骤:

  1. svnserve.conf

    • 打开 svnserve.conf 文件,一般位于 SVN 服务器的存储目录下。
    • 寻找并修改以下常见配置项:
      • anon-access:指定匿名用户的访问权限,可以设置为 none(禁止匿名访问)或 read(只读访问)。
      • auth-access:指定授权用户的访问权限,可以设置为 write(可写访问)或 read(只读访问)。
      • password-db:指定 passwd 文件的路径,确保该路径与实际的 passwd 文件相对应。
      • authz-db:指定 authz 文件的路径,确保该路径与实际的 authz 文件相对应。
      • realm:指定认证域的名称,可以根据需要进行修改。
    • 保存并关闭文件。
  2. passwd

    • 打开 passwd 文件,一般位于 SVN 服务器的存储目录下。
    • 按照以下格式添加用户的认证信息:
      [users] username = password 其中,username 是要添加的用户名,password 是该用户的密码。你可以根据需要添加多个用户的认证信息。
    • 保存并关闭文件。
  3. authz

    • 打开 authz 文件,一般位于 SVN 服务器的存储目录下。
    • 按照以下格式定义用户对不同路径的访问权限:
      [groups]
      admin = alice, bob
      developers = charlie, david[/] 
      @admin = rw [projectA:/] 
      @developers = rw 
      alice = r [projectB:/] 
      @developers = rw 
      bob = r
      在这个示例中,我们定义了两个用户组:admindevelopers/ 表示根路径,projectAprojectB 是具体的项目路径。admin 组拥有对根路径的读写权限,developers 组以及 alicebob 用户对各自项目路径有读写和只读权限。
    • 保存并关闭文件。

在修改完配置文件后,重启 SVN 服务器以使更改生效。请务必谨慎修改这些文件,并确保你对配置项的修改与你的安全和访问需求相符合。

(3)报错解决。

报错如下:

或者

解决方法:

都是因为修改svnserve.conf或者authz或者password文件时,打开注释时,配置的前面有空格,修改后即可。

(4)svnserve.conf、authz、password文件内容(本次学习所修改的配置)。

svnserve.conf文件:

[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
# groups-db = groups
realm = My First Repository
# force-username-case = none
# hooks-env = hooks-env
[sasl]
# use-sasl = true
# min-encryption = 0
# max-encryption = 256

 authz文件:

[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average[groups]
admin = admin,tan
[/]
@admin = rw
[runoob:/]
@admin = rw

password文件:

[users]
admin = admin
tan = 123

五、SVN的基础操作。

(1)SVN 检出操作。

下面是还没人提交文件到版本库,所以检出的只有一个空版本库目录。

下面的是我已经提交一些文件到版本库了,所以再次检出是有文件的。

 所有的文件是指提交的那些文件。

SVN 检出操作


上一章中,我们创建了版本库runoob01,URL为svn://192.168.0.1/runoob01,svn用户user01有读写权限。

我们就可以通过这个URL在客户端对版本库进行检出操作。

svn checkout http://svn.server.com/svn/project_repo --username=user01 以上命令将产生如下结果:

root@runoob:~/svn# svn checkout svn://192.168.0.1/runoob01 --username=user01
A    runoob01/trunk
A    runoob01/branches
A    runoob01/tags
Checked out revision 1.

检出成功后在当前目录下生成runoob01副本目录。查看检出的内容

root@runoob:~/svn# ll runoob01/
total 24
drwxr-xr-x 6 root root 4096 Jul 21 19:19 ./
drwxr-xr-x 3 root root 4096 Jul 21 19:10 ../
drwxr-xr-x 2 root root 4096 Jul 21 19:19 branches/
drwxr-xr-x 4 root root 4096 Jul 21 19:19 .svn/
drwxr-xr-x 2 root root 4096 Jul 21 19:19 tags/
drwxr-xr-x 2 root root 4096 Jul 21 19:19 trunk/

你想查看更多关于版本库的信息,执行 info 命令。

(2) SVN 解决冲突。

版本冲突原因:

假设 A、B 两个用户都在版本号为 100 的时候,更新了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。同时B用户在版本号为 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。

我们已在本地检出 runoob01 库,下面我们将实现版本冲突的解决方法。

我们发现 HelloWorld.html 文件存在错误,需要修改文件并提交到版本库中。

我们将 HelloWorld.html 的内容修改为 "HelloWorld! https://www.runoob.com/"。

root@runoob:~/svn/runoob01/trunk# cat HelloWorld.html 
HelloWorld! http://www.runoob.com/

用下面的命令查看更改:

root@runoob:~/svn/runoob01/trunk# svn diff 
Index: HelloWorld.html
===================================================================
--- HelloWorld.html     (revision 5)
+++ HelloWorld.html     (working copy)
@@ -1,2 +1 @@
-HelloWorld! http://www.runoob.com/
+HelloWorld! http://www.runoob.com/!

尝试使用下面的命令来提交他的更改:

root@runoob:~/svn/runoob01/trunk# svn commit -m "change HelloWorld.html first"
Sending        HelloWorld.html
Transmitting file data .svn: E160028: Commit failed (details follow):
svn: E160028: File '/trunk/HelloWorld.html' is out of date

这时我发现提交失败了。

因为此时,HelloWorld.html 已经被 user02 修改并提交到了仓库。Subversion 不会允许 user01(本例使用的 svn 账号)提交更改,因为 user02 已经修改了仓库,所以我们的工作副本已经失效。

为了避免两人的代码被互相覆盖,Subversion 不允许我们进行这样的操作。所以我们在提交更改之前必须先更新工作副本。所以使用 update 命令,如下:

root@runoob:~/svn/runoob01/trunk# svn update
Updating '.':
C    HelloWorld.html
Updated to revision 6.
Conflict discovered in file 'HelloWorld.html'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,(mc) my side of conflict, (tc) their side of conflict,(s) show all options: mc
Resolved conflicted state of 'HelloWorld.html'
Summary of conflicts:Text conflicts: 0 remaining (and 1 already resolved)

这边输入"mc",以本地的文件为主。你也可以使用其选项对冲突的文件进行不同的操作。

默认是更新到最新的版本,我们也可以指定更新到哪个版本

svn update -r6

此时工作副本是和仓库已经同步,可以安全地提交更改了

root@runoob:~/svn/runoob01/trunk# svn commit -m "change HelloWorld.html second"
Sending        HelloWorld.html
Transmitting file data .
Committed revision 7.

(3)SVN 提交操作。

在上一章中,我们检出了版本库runoob01,对应的目录放在/home/user01/runoob01中,下面我们针对这个库进行版本控制。


我们在库本版中需要增加一个readme的说明文件。

root@runoob:~/svn/runoob01/trunk# cat readme 
this is SVN tutorial.

查看工作副本中的状态。

root@runoob:~/svn/runoob01/trunk# svn status
?       readme

此时 readme的状态为?,说明它还未加到版本控制中。

将文件readme加到版本控制,等待提交到版本库。

root@runoob:~/svn/runoob01/trunk# svn add readme 
A         readme

查看工作副本中的状态

root@runoob:~/svn/runoob01/trunk# svn status     
A       readme

此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。

为了把 readme 存储到版本库中,使用 commit -m 加上注释信息来提交。

如果你忽略了 -m 选项, SVN会打开一个可以输入多行的文本编辑器来让你输入提交信息。

root@runoob:~/svn/runoob01/trunk# svn commit -m "SVN readme."
Adding         readme
Transmitting file data .
Committed revision 8.
svn commit -m "SVN readme."

(4)SVN 版本回退。

svn revert readme命令用于撤销对文件或目录的修改,恢复到最新版本的状态。具体来说,svn revert readme将读取最新版本的readme文件内容,并将其恢复到工作副本中,覆盖当前所有的修改。这样可以丢弃本地的修改,还原到最新的代码状态。


当我们想放弃对文件的修改,可以使用 SVN revert 命令。

svn revert 操作将撤销任何文件或目录里的局部更改。

我们对文件 readme 进行修改,查看文件状态。

root@runoob:~/svn/runoob01/trunk# svn status
M       readme

这时我们发现修改错误,要撤销修改,通过 svn revert 文件 readme 回归到未修改状态。

root@runoob:~/svn/runoob01/trunk# svn revert readme 
Reverted 'readme'

再查看状态。

root@runoob:~/svn/runoob01/trunk# svn status 
root@runoob:~/svn/runoob01/trunk# 

进行 revert 操作之后,readme 文件恢复了原始的状态。 revert 操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用 -R 命令,如下。

svn revert -R trunk

但是,假如我们想恢复一个已经提交的版本怎么办。

为了消除一个旧版本,我们必须撤销旧版本里的所有更改然后提交一个新版本。这种操作叫做 reverse merge。

首先,找到仓库的当前版本,现在是版本 22,我们要撤销回之前的版本,比如版本 21。

svn merge -r 22:21 readme 

(5)SVN 查看历史信息。


通过svn命令可以根据时间或修订号去除过去的版本,或者某一版本所做的具体的修改。以下四个命令可以用来查看svn 的历史:

  • svn log: 用来展示svn 的版本作者、日期、路径等等。

  • svn diff: 用来显示特定修改的行级详细信息。

  • svn cat: 取得在特定版本的某文件显示在当前屏幕。

  • svn list: 显示一个目录或某一版本存在的文件。


(1)svn log

可以显示所有的信息,如果只希望查看特定的某两个版本之间的信息,可以使用:

root@runoob:~/svn/runoob01/trunk# svn log -r 6:8
------------------------------------------------------------------------
r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html first.
------------------------------------------------------------------------
r7 | user01 | 2016-11-07 02:23:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html second
------------------------------------------------------------------------
r8 | user01 | 2016-11-07 02:53:13 +0800 (Mon, 07 Nov 2016) | 1 lineSVN readme.
------------------------------------------------------------------------

如果只想查看某一个文件的版本修改信息,可以使用 svn log 文件路径。

root@runoob:~/svn/runoob01# svn log trunk/HelloWorld.html 
------------------------------------------------------------------------
r7 | user01 | 2016-11-07 02:23:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html second
------------------------------------------------------------------------
r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html first.
------------------------------------------------------------------------
r5 | user01 | 2016-11-07 01:50:03 +0800 (Mon, 07 Nov 2016) | 1 line------------------------------------------------------------------------
r4 | user01 | 2016-11-07 01:45:43 +0800 (Mon, 07 Nov 2016) | 1 lineAdd function to accept input and to display array contents
------------------------------------------------------------------------
r3 | user01 | 2016-11-07 01:42:35 +0800 (Mon, 07 Nov 2016) | 1 line------------------------------------------------------------------------
r2 | user01 | 2016-08-23 17:29:02 +0800 (Tue, 23 Aug 2016) | 1 linefirst file
------------------------------------------------------------------------

如果希望得到目录的信息要加 -v

如果希望显示限定N条记录的目录信息,使用 svn log -l N -v

root@runoob:~/svn/runoob01/trunk# svn log -l 5 -v 
------------------------------------------------------------------------
r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:M /trunk/HelloWorld.htmlchange HelloWorld.html first.
------------------------------------------------------------------------
r5 | user01 | 2016-11-07 01:50:03 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:M /trunk/HelloWorld.html------------------------------------------------------------------------
r4 | user01 | 2016-11-07 01:45:43 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:M /trunk/HelloWorld.htmlAdd function to accept input and to display array contents
------------------------------------------------------------------------
r3 | user01 | 2016-11-07 01:42:35 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:A /trunk/HelloWorld.html (from /trunk/helloworld.html:2)D /trunk/helloworld.html------------------------------------------------------------------------
r2 | user01 | 2016-08-23 17:29:02 +0800 (Tue, 23 Aug 2016) | 1 line
Changed paths:A /trunk/helloworld.htmlfirst file
------------------------------------------------------------------------

(2)svn diff

用来检查历史修改的详情。

  • 检查本地修改
  • 比较工作拷贝与版本库
  • 比较版本库与版本库

(1)、如果用 svn diff,不带任何参数,它将会比较你的工作文件与缓存在 .svn 的"原始"拷贝。

root@runoob:~/svn/runoob01/trunk# svn diff
Index: rules.txt
===================================================================
--- rules.txt (revision 3)
+++ rules.txt (working copy)
@@ -1,4 +1,5 @@
Be kind to others
Freedom = Responsibility
Everything in moderation
-Chew with your mouth open

(2)、比较工作拷贝和版本库

比较你的工作拷贝和版本库中版本号为 3 的文件 rule.txt。

svn diff -r 3 rule.txt

(3)、比较版本库与版本库

通过 -r(revision) 传递两个通过冒号分开的版本号,这两个版本会进行比较。

比较 svn 工作版本中版本号2和3的这个文件的变化。

svn diff -r 2:3 rule.txt

(3)svn cat

如果只是希望检查一个过去版本,不希望查看他们的区别,可使用svn cat

svn cat -r 版本号 rule.txt

这个命令会显示在该版本号下的该文件内容


(4)svn list

svn list 可以在不下载文件到本地目录的情况下来察看目录中的文件:

$ svn list http://192.168.0.1/runoob01
README
branches/
clients/
tags/

(5)SVN分支。


Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。

比如项目 demo 下有两个小组,svn 下有一个 trunk 版。

由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组 1 继续完成原来正进行到一半的工作(某个模块),小组 2 进行新需求的开发。

那么此时,我们就可以为小组2建立一个分支,分支其实就是 trunk 版(主干线)的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,到最后我们可以通过(合并)功能,将分支合并到 trunk 上来,从而最后合并为一个项目。

我们在本地副本中创建一个 my_branch 分支。

root@runoob:~/svn/runoob01# ls
branches  tags  trunk
root@runoob:~/svn/runoob01# svn copy trunk/ branches/my_branch
A         branches/my_branch
root@runoob:~/svn/runoob01# 

查看状态:

root@runoob:~/svn/runoob01# svn status
A  +    branches/my_branch
A  +    branches/my_branch/HelloWorld.html
A  +    branches/my_branch/readme

提交新增的分支到版本库。

root@runoob:~/svn/runoob01# svn commit -m "add my_branch" 
Adding         branches/my_branch
Replacing      branches/my_branch/HelloWorld.html
Adding         branches/my_branch/readmeCommitted revision 9.

接着我们就到 my_branch 分支进行开发,切换到分支路径并创建 index.html 文件。

root@runoob:~/svn/runoob01# cd branches/my_branch/
root@runoob:~/svn/runoob01/branches/my_branch# ls
HelloWorld.html  index.html  readme

将 index.html 加入版本控制,并提交到版本库中。

root@runoob:~/svn/runoob01/branches/my_branch# svn status
?       index.html
root@runoob:~/svn/runoob01/branches/my_branch# svn add index.html 
A         index.html
root@runoob:~/svn/runoob01/branches/my_branch# svn commit -m "add index.html"
Adding         index.html
Transmitting file data .
Committed revision 10.

切换到 trunk,执行 svn update,然后将 my_branch 分支合并到 trunk 中。

root@runoob:~/svn/runoob01/trunk# svn merge ../branches/my_branch/
--- Merging r10 into '.':
A    index.html
--- Recording mergeinfo for merge of r10 into '.':G   .

此时查看目录,可以看到 trunk 中已经多了 my_branch 分支创建的 index.html 文件。

root@runoob:~/svn/runoob01/trunk# ll
total 16
drwxr-xr-x 2 root root 4096 Nov  7 03:52 ./
drwxr-xr-x 6 root root 4096 Jul 21 19:19 ../
-rw-r--r-- 1 root root   36 Nov  7 02:23 HelloWorld.html
-rw-r--r-- 1 root root    0 Nov  7 03:52 index.html
-rw-r--r-- 1 root root   22 Nov  7 03:06 readme

将合并好的 trunk 提交到版本库中。

root@runoob:~/svn/runoob01/trunk# svn commit -m "add index.html"
Adding         index.html
Transmitting file data .
Committed revision 11.

(6)SVN 标签(tag)。


版本管理系统支持 tag 选项,通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。

Tags 即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本,这跟 VSS 中的 Tag 大致相同。

我们在本地工作副本创建一个 tag。

root@runoob:~/svn/runoob01# svn copy trunk/ tags/v1.0
A         tags/v1.0

上面的代码成功完成,新的目录将会被创建在 tags 目录下。

root@runoob:~/svn/runoob01# ls tags/
v1.0
root@runoob:~/svn/runoob01# ls tags/v1.0/
HelloWorld.html  readme

查看状态。

root@runoob:~/svn/runoob01# svn status
A  +    tags/v1.0

提交tag内容。

root@runoob:~/svn/runoob01# svn commit -m "tags v1.0" 
Adding         tags/v1.0
Transmitting file data ..
Committed revision 14.

(7)TortoiseSVN 使用教程。

TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。


(1)TortoiseSVN 安装

下载地址:https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。

目前最新版为 1.11.0 下载地址: https://osdn.net/projects/tortoisesvn/storage/1.11.0/

在语言补丁包中我们可以找到中文的补丁并下载下来:

运行下载的 TortoiseSVN 安装程序

运行下载的 TortoiseSVN 中文语言包

正确安装后,应该进行一次的重开机,以确保 TortoiseSVN 的正确无误。

修改 TortoiseSVN 默认语言

TortoiseSVN 安装完后默认的界面是英文的,我们可以通过设置修改成已安装语言


(2)TortoiseSVN 的使用

建立一个 runoob01 的工作目录

所谓的 runoob01 目录其实就是您平常用来存放工作档案的地方。通常我们会等到自己的工作做的一个段落的时候再进行备份。所以我们平常都是在 runoob01 目录下面工作,等到适当时机在 commit 到 repository 中。举例来说,我们想在 D 盘下面建立一个名为 runoob01 的目录。首先先把这个目录建立出来。

进入创建的目录在空白处按下右键后(您可以在 MyWork 目录的 icon 上按,也可进入 MyWork 目录后,在空白的地方按),选择 SVN checkout。

接着您可以看到如下的画面:

首先我们要填入的是 repository(版本库)的位置,对于 SVN 来说,repository 的位置都是 URL。版本库 URL 这里填入我们测试的版本仓库地址 svn://10.0.4.17/runoob01

接着,稍微看一下 Checkout directory(检出至目录),这个字段应该要指向您的 runoob01 目录。

确认后,按下 OK 按钮,您应该可以看到如下的信息窗口。

这样就表示动作完成。按下 OK 按钮后,再到您刚刚建立的目录下。您将会看到 MyWork 目录下面多了一个名为 .svn 的目录(这个目录是隐藏的,如果您的档案管理员没有设定可以看到隐藏目录,您将无法看到它) 。

如果您要在一个已经存在的 SVN Server 上面 checkout 出上面的档案,您只需要给定正确的 SVN URL 以及要 checkout 目录的名称。就可以取得指定的档案及目录了。


(3)新增档案及目录到 Repository 中 add commit

创建目录 dir01, 在目录里新增文件

将新增的文件加入到 SVN 版本控制中,TortoiseSVN 会把准备要加入的档案及目录,勾选需要加入的文件。

按下 OK 后,您将会看到如下的讯息窗口:

这个 Add(增加)的动作并未真正的将档案放到 Repository 中。仅仅是告知 SVN 准备要在 Repository 中放入这些档案。 此时的文件状态为:

这些档案真正的放入到 Repository 中,空白处右键选择 SVN commit(提交) 紧接着,您将会看到如下的窗口出现:

在这里可以清楚地了解到哪些档案要被 commit 到 repository(版本库)中。同样的,如果您有档案不想在这个时候 commit 到 Repository,您可以取消选取的档案,这样他们就不会被 commit 到 Repository 中。在"信息"文本框中可以写入对本次 commit 的说明。

点击"确认"后完成 commit 动作,然后您可以到 runoob 目录中,确定是否所有的档案 icon 都有如下的绿色勾勾在上面,这样代表您的档案都正确无误的到 repository 中。


(4)更新档案及目录 update

由于版本控制系统多半都是由许多人共同使用。所以,同样的档案可能还有人会去进行编辑。为了确保您工作目录中的档案与 Repository 中的档案是同步的。建议您在编辑前都先进行更新的动作。

在想要更新的档案或目录 icon 上面按下鼠标右键。并且选择 SVN Update。

有时我们需要回溯至特定的日期或是版本,这时就可以利用 SVN 的 Update to revision 的功能。在想要更新的档案或目录 icon 上面按下鼠标右键。并且选择 TortoiseSVN->Update to revision(更新至版本)。


(5)复制档案及目录 branch

很多时候您会希望有另外一个复制的目录来进行新的编修。等到确定这个分支的修改已经完毕了,再合并到原来的主要开发版本上。举例来说,我们目前在runoob01/trunk下面有如下的目录及档案:

现在,我们要为 trunk 这个目录建立一个 branch。假设我们希望这个目录是在 D:\runoob01\branch。首先我们可以在 trunk 目录下面的空白处,或是直接在 trunk 的 icon 下面按下鼠标右键选择 Branch/Tag…(分支/标记)这个选项,您将会看到如下的对话框出现。

请先确认 From WC at URL(从工作副本/URL): 中的目录是您要复制的来源目录。接着,在 To URL(至路径)中输入您要复制过去的路径。通常我们会将所有的 branch 集中在一个目录下面。以上面的例子来说,branch 档案都会集中在 branch 的子目录下面。在 To URL 中您只需要输入您要的目录即可。目录不存在时,会由 SVN 帮您建立。特别需要注意的是 SVN 以斜线作为目录分隔字符,而非反斜线。 接着在 Log message(日志信息)输入您此次 branch 的目的为何。按下 OK 就可以了。

如果成功,将可以看到下面的画面:

按下 OK 就可以关闭这个窗口了。如果您此时立刻去 runoob01 目录的 branch 子目录下面,您将会失望的发现在该目录下面并没有刚刚指定的目录存在。这是因为您 runoob01 目录的部份还是旧的,您只需要在 branch 子目录下面进行 SVN update 就可以看到这个新增的目录了。新增的目录就与原来的目录无关了。您可以任意对他进行编辑,一直到您确认好所有在 branch 下面该做的工作都完成后,您可以选择将这个 branch merge 回原来的 trunk 目录,或者是保留它在 branch 中。


(6)合并动作 merge

假如我们在 branch 分支中对文件进行了修改或增加了文件,要 merge 回 trunk 目录中,方法很简单。以上面的例子来说,我们在 D:\runoob01\trunk目录空白处,按下鼠标右键,选择 Merge(合并):

这个画面主要分为三个部份,前面的 From: 与 To: 是要问您打算从 Branch 中的哪个版本到哪个版本,merge 回原来的 trunk 目录中。因此,From 跟 To 的 URL 字段应当都是指定原来 branch 的目录下。剩下的就是指定要 merge 的 revision 范围。以上面的例子而言,我们从 Branch 的 Revision 7 开始 merge 到 Branch 下面的最新版本。您可以透过,Try run 按钮,试作一次 Merge。这个 merge 只会显示一些讯息,不会真正的更新到 trunk 的目录去。只有按下 Merge 按钮后,才会真正的将 branch 的档案与 trunk 的档案合并起来。

如果您确认这次的 merge 没有问题,您可以直接使用 commit 来将这两个被修改的档案 commit 回 SVN repository 上。如果有问题,您可以直接修改这两个档案,直到确认 ok 了,再行 commit。


(7)制作 Tag 或是 Release

所谓的 Tag 或是 Release 就是一个特别的版本,因为这个版本可能有特别的意义。例如:这个版本是特别的 Milestone 或是 release 给客户的版本。其实,Tag 与 Release 的作法与 Branch 完全相同。只是 Branch 可能会需要 merge 回原来的 trunk 中,而 tag 及 release 大部分都不需要 merge 回 trunk 中。

举例来说,今天我们的 trunk 做了一版,这个版本被认定是软件的 1.0 版。 1.0版对于开发来说是一个非常重要的里程碑。所以我们要特别为他做一个标记,亦即 Tag。假设,这个 1.0 版是要正式 release 给客户或是相关 vendor,我们要可以为他做一个 Release 的标记。基本上,SVN 只有目录的概念,并没有什么 Tag 的用法。所以您会看到在 SVN 的选单上面,Branch 与 Tag 是同一个项目。以这个 1.0 的例子来说,我们在 runoob01 目录下创建 tags 目录用于存放打 tag 的版本,并提交到版本库,然后在 Trunk 上面,按下鼠标右键,选择 Branch/Tag 的项目:

成功的话,您就在对应的 Tag 目录下面建立了一个 v1.0 的目录。当然,如果您这时到 Tag 的目录下面去,会看不到这个目录,您需要在 Tag 目录下面 update 一下,才能看到它。

六、TortoiseSVN和SVN托管服务平台的基本操作。

安装好ortoiseSVN客户端软件。 

(1)在SVN托管服务网站创建一个项目。

https://svnbucket.com/ 是一个 SVN 托管服务网站。类似于 GitHub 或 Bitbucket。

登录SVNBucket - SVN仓库,免费 SVN 代码托管服务器,不限私有,不限成员 网站,然后创建一个项目,复制svn地址。            

(2)svn checkout 检出操作。

找好一个目录后,进去右击鼠标。

之后会弹出下面的窗口页面:

然后会弹出这个窗口:

(3)svn commit 提交。

(4)svn update 更新(拉取最新版本)。

如果 SVN 的版本库升级了,而你的工作副本也修改了一些内容,当你执行 SVN 更新操作时,SVN 会尝试将版本库中的最新代码与你的工作副本合并。如果版本库中的更新与你的修改发生冲突(即在相同的文件的相同位置进行了修改),你需要手动解决这些合并冲突,通常的做法是打开冲突的文件,手动编辑并选择保留哪些修改。

基本上更上面的操作差不多,这个是把版本库的最新版更新到本地工作副本。

(5)显示日志(查看历史提交记录)。


(6)撤销和恢复。

(1)撤销本地修改。

就是撤销还没提交的内容,把它恢复到上一次提交或更新后的状态。

(2)撤销已提交内容(回退到指定版本号的前一个版本号模样)。

这里我们选的是版本号2,即复原了版本号2所做的一切,就是说工作副本变成了版本号1。

(3)恢复到指定版本。

需要重新提交,版本库才能跟工作副本同步。

(7)查看修改前后差异。

只要是点击TortoiseSVN功能弹出的窗口中有文件,双击它就有该功能,比如查看日志窗口

(8)添加忽略。

如果之前提交的有符合忽略规则的文件,再次提交后,版本库会把它们删除掉。

(9)解决冲突。

注意:二进制是无法进行合并的,所以不要多个人同时操作。

发生冲突后,选择冲突那行右键选择解决方案。

(10)

相关文章:

61.SVN版本控制系统

SVN&#xff08;Subversion&#xff09;是一种集中式版本控制系统&#xff0c;它有一个中央仓库用于存储代码库的完整历史记录。相对于分布式版本控制系统&#xff08;例如 Git&#xff09;&#xff0c;SVN 不支持本地仓库。 一、SVN 安装。 &#xff08;1&#xff09;在windo…...

操作系统 内存管理篇

一.程序的装入和链接 装入方式&#xff1a; 链接方式&#xff1a; 二.进程的内存映像 三.内存的分配 1.连续分配 分配方式&#xff1a; 2.不连续分配 分页&#xff1a;页面大小一致 引入快表&#xff08;和 cache 处理思路一致&#xff09; 升级到二级页表 分段&#xff1a;…...

深度学习中用来训练的train.py 探究学习2.0( 数据预处理)

数据预处理 下列代码为train.py中常见的一些数据处理方法 train_transform transforms.Compose([transforms.Resize((224, 224)),transforms.RandomVerticalFlip(),# 随机旋转&#xff0c;-45度到45度之间随机选transforms.RandomRotation(45),# 从中心开始裁剪transforms.C…...

vscode debug c++代码

需要提前写好CMakeLists.txt 在tasks.json中写好编译的步骤&#xff0c;即tasks&#xff0c;如cmake … 和make -j 在lauch.json中配置可执行文件的路径和需要执行tasks中的哪一个任务 具体步骤&#xff1a; 1.写好c代码和CMakeLists.txt 2.配置tasks.json 终端–>配置任务…...

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…...

汽车级EEPROM 存储器 M24C64-DRMN3TP/K是电可擦除可编程只读存储器?它的功能特性有哪些?

M24C64-DRMN3TP/K是一款64 Kbit串行EEPROM汽车级设备&#xff0c;工作温度高达125C。符合汽车标准AEC-Q100 1级规定的极高可靠性。 该设备可通过一个高达1MHz的简单串行I2C兼容接口访问。 存储器阵列基于先进的真EEPROM技术&#xff08;电可擦除可编程存储器&#xff09;。M2…...

VS Code无法远程ubuntu

①windows下cmd中执行命令&#xff1a; ssh-keygen -t rsa -C "xxxxxx.com" ②ubuntu 下bash 命令 ssh-keygen -t rsa -C "xxxxxx.com" ③cat id_rsa.pub >> ~/.ssh/authorized_keys ④ C:\Users\Administrator\AppData\Roaming\Code\User\set…...

大数据开发职业规划

大数据开发职业规划 我的学历是双非本&#xff0c;在学校学习的是大数据专业&#xff0c;目前是在企业做大数据全栈的工作&#xff0c;爬虫&#xff0c;数仓&#xff0c;风控项目&#xff0c;etl开发都做 .................................................................…...

XxIJob入门-示例

一、部署 xxlJob (一) 下载地址&#xff0c; git clone 到本地。 http://gitee.com/xuxueli0323/xxl-job https://github.com/xuxueli/xxl-job (二) 插入 xxl_job 的sql脚本&#xff1a; 在项目的 /xxl-job/doc/db/tables_xxl_job.sql &#xff0c;找到sql脚本&#xff0c…...

单挑力扣(LeetCode)SQL题:1549. 每件商品的最新订单(难度:中等)

相信很多学习SQL的小伙伴都面临这样的困境&#xff0c;学习完书本上的SQL基础知识后&#xff0c;一方面想测试下自己的水平&#xff1b;另一方面想进一步提升&#xff0c;却不知道方法。 其实&#xff0c;对于技能型知识&#xff0c;我的观点一贯都是&#xff1a;多练习、多实…...

Javacv-利用Netty实现推流直播复用(flv)

前言 上一篇文章《JavaCV之rtmp推流&#xff08;FLV和M3U8&#xff09;》介绍了javacv的基本使用&#xff0c;今天来讲讲如何实现推流复用。 以监控摄像头的直播为例&#xff0c;通常分为三步&#xff1a; 从设备获取音视频流利用javacv进行解码&#xff08;例如flv或m3u8&am…...

cfa一级考生复习经验分享系列(十一)

理工科已经毕业&#xff0c;正在工作&#xff0c;毫无金融背景。一共准备了四个月&#xff0c;每天下班和周末抽时间看看。前三个月节奏比较松散&#xff0c;毕竟时不时有人叫我出去high&#xff0c;最后一个月认真看了看。 用到的资料 JC网课&#xff0c;官方Mock&#xff0c;…...

Nginx基本配置内容

http 模块适用于处理 Web 请求&#xff0c;而 stream 模块适用于处理非 HTTP 流量&#xff0c;如数据库连接、邮件传输等。 在 stream 模块中&#xff0c;你可以配置一些 TCP 或 UDP 的代理服务&#xff0c;以便 Nginx 能够转发这些流量。 与网站相关的 关于网站相关的要写在ht…...

Jenkins安装与设置(插件安装失败,版本问题解决)

早期的使用docker安装jenkins的方法会出现插件无法安装的问题&#xff0c;是由于docker拉取的jenkins版本太低了 jdk安装 Linux系统安装JDK1.8 详细流程 maven安装&#xff1a; centos7下安装Maven 使用docker进行安装jenkins&#xff1a; 先把镜像和容器卸干净 docker ps -a…...

精度提升10个点!HD-Painter:无需训练的文本引导高分辨率图像修复方案!

基于文本到图像扩散模型的空前成功&#xff0c;在文本引导的图像修复方面取得了最新进展&#xff0c;取得了异常逼真和视觉上可靠的结果。然而&#xff0c;目前的文本到图像修复模型仍然存在显著的改进潜力&#xff0c;特别是在更好地与用户提示对齐和执行高分辨率修复方面。因…...

javaweb初体验

javaweb初体验 文章目录 javaweb初体验前言一、流程&#xff1a;1.创建Maven的父工程2.创建Maven&#xff0c;Webapp的子工程3.在pom.xml文件中添加依赖&#xff08;父工程与子工程共用&#xff09;4.写一个helloservlet类实现httpservlet接口&#xff0c;重写doget&#xff0c…...

手写爬虫框架

前言 参照了Scrapy、Feapder的设计模式&#xff0c;实现的一个轻量级爬虫框架&#xff08;目前约200行代码&#xff09; 源码地址 https://gitee.com/markadc/pader 项目持续更新中…...

基于Kettle和帆软Finereport的血缘解析

一、背景&#xff1a; 用户经常会针对数据存在质量的存疑&#xff0c;反馈数据不准。开发人员排查数据质量问题步骤&#xff1a;首先和业务人员对接了解是哪里数据不准确&#xff0c;要定位是哪张报表&#xff0c;然后查看报表后面数据来源&#xff0c;然后一路排查数仓。往往定…...

给qemu虚机更换(Windows PE)光盘

1. 背景 qemu虚机里运行windows。如果遇到虚机windows启动故障&#xff0c;甚至连安全模式也故障时&#xff0c;可以尝试更换另一个光驱里的光盘为pe光盘。 2. 步骤 2.1. 找出VDI虚机所在的计算节点 ssh登录之&#xff0c;virsh list获得虚机id&#xff0c;例如 391 1255…...

python 神经网络归纳

CNN卷积神经网络 一个卷积神经网络主要由以下5层组成&#xff1a; 数据输入层/ Input layer卷积计算层/ CONV layerReLU激励层 / ReLU layer池化层 / Pooling layer全连接层 / FC layer 1. 数据输入层 该层要做的处理主要是对原始图像数据进行预处理&#xff0c;其中包括&…...

Python高级语法与正则表达式

Python提供了 with 语句的写法&#xff0c;既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作&#xff0c;即使出现异常也会自动关闭文件操作。 # 1、以写的方式打开文件 with open(1.txt, w) as f:# 2、读取文件内容f.write(hello world) 生成器的创建方…...

【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解&#x1f30f;题目描述&a…...

Python如何将图片转换成字符

PIL(Python Image Library)库是Python平台上一个功能强大的图像处理标准库&#xff0c;支持图像的存储、显示和处理&#xff0c;几乎可以处理所有图片格式&#xff0c;如图像的压缩、裁剪、叠加、添加文字等等。 安装PIL库:pip install pillow from PIL import Image ascii_cha…...

国家开放大学形成性考核 统一资料 参考试题

试卷代号&#xff1a;1174 水工钢筋混凝土结构&#xff08;本&#xff09;参考试题 一、选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;在所列备选项中&#xff0c;选1项正确的或最好的作为答案&#xff0c;将选项号填入各题的括号中&#xff09; 1.钢筋混凝土结…...

4.7 【共享源】流的生产者(二)

七,模式 流的模式决定了Screen如何使前台缓冲区可用。生产者通过调用screen_set_stream_property_iv()并设置SCREEN_PROPERTY_MODE属性来设置模式。有效模式如下: 7.1 SCREEN_STREAM_MODE_DEFAULT 如果生产者应用程序没有在流上明确设置 SCREEN_PROPERTY_MODE 属性,则 Sc…...

流量录制回放工具在自动化测试领域应用探索

引言&#xff1a; 随着中国农业银行技术架构的日益更迭与业务场景的不断创新&#xff0c;测试工作正在面临数据构造繁琐、案例维护成本较高且质量参差不齐等诸多问题与挑战&#xff0c;主要体现在以下四方面&#xff1a; 一是在系统架构升级与代码重构时&#xff0c;大量原始接…...

【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 Shell method Setting up the Integral 例题 Example 1: Example 2: Example 3: Example …...

Ubuntu20.04 及深度学习环境anaconda、cuda、cudnn、pytorch、paddle2.3安装记录

学习目标&#xff1a; Ubuntu20.04下装好torch、paddle深度学习环境。 选择的版本环境是 &#xff1a;最新的nvidia驱动、cuda 11.1 、cudnn v8.1.1&#xff0c;下面会说为啥这么选。 学习内容&#xff1a; 1. Ubuntu20.04仓库换源 本节参考Ubuntu 20.04 Linux更换源教程 2…...

场景切割CVPr2022 SceneSegmentation

目录 算法介绍 无监督训练原理 源码地址: lstm模块 bilstm opencv场景分割 加阈值:...

Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务。当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client或者Spring的RestTemplate。 那么,为…...

[node] Node.js的文件系统

[node] Node.js的文件系统 文件系统的使用异步和同步input.txt示例 常用方法打开文件语法示例 获取文件信息语法示例 写入文件语法示例 读取文件语法示例 关闭文件语法示例 截取文件语法示例 删除文件语法示例 创建目录语法示例 读取目录语法示例 删除目录语法示例 文件模块方法…...

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch、Zookeeper、Kafka、NoSQL等各类软件

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;…...

CJson 使用 - 解析Object结构

简介 准备在开发板中使用json结构传送数据, 选用了cJson, 现在看下cJson的使用吧步骤 下载 git clone https://github.com/DaveGamble/cJSON 或者直接压缩包下载也行, 毕竟国内有时候下载不下来Qt 中使用cJson 在下载的cJson 目录中加入cJson.pri, 内容如下 INCLUDEPATH …...

MySQL8主主搭建

-- mysql8 主主搭建 mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz 主1 &#xff1a; 192.168.2.160 主2 &#xff1a; 192.168.2.161 --解压mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz为mysql8 -- 初始化mysql8 &#xff08;略&#xff09; -- 参数192.168.2.160 [root…...

使用Pycharm一键将.ui文件生成.py文件配置教程、一键打开QTDesigner教程

2df3621a-7ffd-4f18-9735-b86464b83a5b 前言 我痛恨所有将白嫖归为理所应当的猪&#x1f416;。 教程 打开pycharm之后&#xff0c;依次点击File->Settings->Tools->External Tools&#xff0c;进入如下界面&#xff1a; 1、配置快捷打开Qt Designer 点击号&…...

React 路由跳转

1. push 与 replace 模式 默认情况下&#xff0c;开启的是 push 模式&#xff0c;也就是说&#xff0c;每次点击跳转&#xff0c;都会向栈中压入一个新的地址&#xff0c;在点击返回时&#xff0c;可以返回到上一个打开的地址&#xff0c; 就像上图一样&#xff0c;我们每次返…...

【MySQL】数据处理:从SQL批量删除报错到Python优雅解决

一、背景 MySQL数据库表中有一批重复的脏数据,为不影响正常业务,需要进行批量删除。 二、SQL批量删除 首先想到的是编写SQL语句来批量删除:删除身份证号为51****59且ID不为5的全部数据(保留ID为5的那一条数据) DELETE FROM test_table WHERE id IN ( SELECT i…...

Rust 软件测试

Rust 第18节 软件测试 测试已写的函数 在创建每一个lib crate时&#xff0c;rust都会自动生产一个测试 mod;名字为tests; tests mod 被属性 #[cfg(test)] 修饰&#xff0c;用于测试&#xff1b; 在mod 内&#xff0c;需要在函数头上加属性 #[test]进行修饰&#xff0c;让其变为…...

win11下配置visual studio 2022+PCL1.13.1

第一部分&#xff1a;visual studio2022 安装 vs官网网址如下&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 第一步&#xff1a;我们打开官网链接&#xff0c;按如下操作点击下载免费版本的exe文件 第二步&#xff1a;打开下载目录下的安装文件进行安装&#…...

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…...

【分享】4个方法打开PDF文件

PDF是很多人工作中经常使用的电子文档格式&#xff0c;但是可能有些刚接触的小伙伴不知道用什么工具来打开PDF文件&#xff0c;今天小编就来分享一下4种常用的工具。 1. 使用浏览器 只要有电脑基本都会安装一到两款浏览器&#xff0c;其实浏览器也可以用来打开PDF文件。 只需…...

React 调试

React 调试 console 调试 console.log console.info console.warn console.error console.time() & console.timeEnd() console.count() debugger调试 chrome断点调试 chrome条件断点 HTML节点复制 选中节点&#xff0c;使用 $0复制 JavaScript对象复制 copy…...

List 流的使用

摘要 本文将介绍在 Java 1.8 中对 List 进行流操作的使用方法。引入的 java.util.stream 包为开发者提供了一种更为便捷和强大的方式来处理集合数据。通过使用流&#xff0c;我们能够以声明性的方式进行集合操作&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可…...

设计模式:单例模式(使用c++分别实现饿汉式单例、带双重检查锁定机制的懒汉式单例以及IoDH技术的单例)

单例模式 引言正文1. 饿汉式单例2. 带双重检查锁定机制的懒汉式单例3. IoDH技术的单例 结论优点饿汉式单例带双重检查锁定机制的懒汉式单例IoDH技术的单例 缺点饿汉式单例带双重检查锁定机制的懒汉式单例IoDH技术的单例 引言 在软件开发中&#xff0c;单例模式是一种很常用的设…...

[编程相关]正则表达式Regex语法

--目录-- 0. 前言1. 正则语法2. 正则搜索语法&#xff08;1&#xff09;字符集 Character_Classes&#xff08;2&#xff09;锚定符 Anchors&#xff08;3&#xff09;计数 Quantifiers&#xff08;4&#xff09;分组与索引 Group_And_Reference&#xff08;5&#xff09;周围 …...

axios实例配置和使用

一.vite项目中引入axios 1.1.安装axios pnpm add axios --save 二.配置axios实例 2.1实例配置 import axios from ‘axios’ import router from ‘/router’ const instance axios.create({ baseURL:“http://127.0.0.1:8080”, timeout:10*1000, //最长响应时间 }) instan…...

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…...

TUP实现一对一聊天

package TCP; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 发送消息线程 */ class Send ext…...

Kafka设计原理详解

Kafka核心总控制器 (Controller) 在Kafka集群中&#xff0c;通常会有一个或多个broker&#xff0c;其中一个会被选举为控制器 (Kafka Controller)&#xff0c;其主要职责是管理整个集群中所有分区和副本的状态。具体来说&#xff1a; 当某个分区的leader副本出现故障时&#…...