您的位置:首页 > 其它

svn命令行使用总结(转载集合)

2016-04-29 14:55 471 查看

转载地址:知蚁博客

创建svn仓库

原则上svn仓库和其他文件一样随便放置,但是有两个位置最为常用:/usr/local/svn 以及 /home/svn。

我们选择前者,也就是将subversion的文件仓库放置在/usr/local/svn,项目名称起名为calc,用来管理一个计算器程序的源码

在创建svn的仓库之前,需要先进行linux权限相关的工作,首先创建一个组,并将自己添加到这个组中(如果你直接用的root账号就不用这些操作了),下面的kris需要换成你自己的用户名。

sudo addgroup subversion

sudo usermod -G subversion -a kris


您需要注销然后再登录以便您能够成为 subversion 组的一员,输入groups指令,你可以看到输出信息中有subversion了

现在执行下面的命令

$ sudo mkdir /usr/local/svn

$ cd /usr/local/svn

$ sudo mkdir calc

$ sudo chown -R root:subversion calc


下面的命令用于创建 SVN 文件仓库:

$ sudo svnadmin create /usr/local/svn/calc


赋予组成员对所有新加入文件仓库的文件拥有相应的权限:

$ sudo chmod -R g+rws calc


上面的几步操作非常非常的重要,否则你在后续Check in的时候遇到如下错误:

Can’t open ‘/usr/local/svn/calc/db/txn-current-lock’: Permission denied


最后,为了确认你的权限设置是否正确,请查看txn-current-lock文件的权限和用户以及组信息,应该类似于下面的输出信息:

$ ls -l /usr/local/svn/calc/db/txn-current-lock

-rw-rwSr– 1 root subversion 0 2009-06-18 15:33 txn-current-lock


导入数据到仓库

为了后续的学习,这里我们创建一个稍微复杂点的目录结构,运行如下指令:

$ cd ~

$ mkdir -p calc/{trunk,branches,tags}

$ ll calc/

total 20

drwxr-xr-x 5 root root 4096 2012-09-06 17:55 ./

drwxr-xr-x 14 kris kris 4096 2012-09-06 17:55 ../

drwxr-xr-x 2 root root 4096 2012-09-06 17:55 branches/

drwxr-xr-x 2 root root 4096 2012-09-06 17:55 tags/

drwxr-xr-x 2 root root 4096 2012-09-06 17:55 trunk/


接下来我们将这个文件夹的内容导入到svn仓库中

$ cd ~/calc

$ svn import . file:///usr/local/svn/calc -m “import src files”

Adding trunk

Adding branches

Adding tags

Committed revision 1.


svn import将当前目录(.)中的内容导入到svn仓库中,通过svn list指令可以看到仓库中的内容了

$ svn list file:///usr/local/svn/calc/

branches/

tags/

trunk/


建立工作拷贝

在calc目录,输入下面指令

$ svn log

svn: warning: ‘.’ is not a working copy


很遗憾,虽然我们已经将calc文件夹导入到了svn的仓库中,但是现在这个calc文件夹和svn仓库中的calc文件夹是没什么关系的。要让他们有点关系,我们需要建立calc的工作拷贝。

$ cd ..

$ svn checkout file:///usr/local/svn/calc/

svn: Failed to add directory ‘calc/trunk’: an unversioned directory of the same name already exists


因为已经存在存在相应的文件夹了,svn在checkout的时候会出错,那怎么办呢,很好办,加上

–force即可。

\$ svn checkout --force file:///usr/local/svn/calc/

E calc/trunk

E calc/branches

E calc/tags


Checked out revision 1.好了,顺利的checkout下来了,下面再进入calc目录,试试svn log吧。

`$ cd calc/

$ svn log

r1 | root | 2012-09-06 17:57:51 +0800 (Thu, 06 Sep 2012) | 1 line

import src files`

现在,我们的calc文件夹就是svn文件出口中的calc的一个工作拷贝了,它们之间总算是扯上关系了,后续我们就可以在这个文件夹中进行操作,然后将

文件commit到svn仓库中了,也就是说calc中的所有文件都处于svn的版本控制之下了。

换个方法建立工作拷贝

上面的方法是在现有文件夹上建立工作副本,我们还可以将现有文件夹整个删除,然后再建立工作拷贝。

`$ cd ..

$ rm -r calc/

$ svn co file:///usr/local/svn/calc/

A calc/trunk

A calc/branches

A calc/tags

Checked out revision 1.

$ cd calc/

$ svn log

r1 | root | 2012-09-06 17:57:51 +0800 (Thu, 06 Sep 2012) | 1 line

import src files`

这里的svn co是svn checkout的简写形式。

忽略文件

进入trunk文件夹,新建一个main.c文件

root@letuknowit:/home/kris/calc/trunk# cat > main.c


#include <stdio.h>

int main()
{
printf("Hello world.\n");
return 0;
}


^C(这个对应按键 Ctrl+C,用于结束cat的输入)

下面通过gcc进行编译,生成一个名为calc的可执行文件,编译成功后查看文件夹,应该会出现mian.c和calc两个文件

root@letuknowit:/home/kris/calc/trunk# gcc -o calc main.c

root@letuknowit:/home/kris/calc/trunk# ls -al

total 28

drwxr-xr-x 3 root root 4096 2012-09-10 09:28 ./

drwxr-xr-x 6 root root 4096 2012-09-07 17:10 ../

-rwxr-xr-x 1 root root 8376 2012-09-10 09:28 calc*

-rw-r--r-- 1 root root   73 2012-09-10 09:27 main.c

drwxr-xr-x 6 root root 4096 2012-09-10 09:23 .svn/


可以通过运行calc文件查看运行结果

root@letuknowit:/home/kris/calc/trunk# ./calc

Hello world.


接下来执行svn st命令,看看有什么变化

root@letuknowit:/home/kris/calc/trunk# svn st

?       calc

?       main.c


问号说明这是还没有处于svn版本控制下的文件,因为是我们新添加的文件嘛,当然不在版本控制下了。这两个文件中,calc是我们生成的可执行文件,在调试的时候会频繁的生成,因此并不想把他放到版本控制下,因此需要忽略掉这个文件。

root@letuknowit:/home/kris/calc/trunk# export SVN_EDITOR=vim

root@letuknowit:/home/kris/calc/trunk# svn propedit svn:ignore .

Set new value for property 'svn:ignore' on '.'


其中export SVN_EDITOR=vim设置SVN的默认编辑器为vim。“svn propedit svn:ignore .”用来改变当前目录(trunk,也就是包含calc的文件夹)的属性,调用该命令后,会出现一个vim的窗口,写入需要忽略的文件(我们这里的情况写入calc即可),如果有多个需要忽略的文件,就每行写一个,执行完命令后,系统会提示为当前目录设置了新的svn:ignore属性。

再通过svn st命令查看当前目录结构,发现calc已经没有了,取而代之的是对于当前文件夹(.)的修改。

root@letuknowit:/home/kris/calc/trunk# svn st

M      .

?       main.c


下面将对当前文件夹的svn:ignore属性修改提交到svn文件仓库。

`root@letuknowit:/home/kris/calc/trunk# svn commit -m “ignore file calc”

Sending trunk

Committed revision 2.`

后续,不管你怎么修改calc文件,svn都会对它置之不理了。

注意事项

在使用这个SVN的属性编辑前,你得确保后面的“目录名称”是SVN版本控制的目录,为了验证请看下面的示例。

root@letuknowit:/home/kris/calc/trunk# mkdir t

root@letuknowit:/home/kris/calc/trunk# svn st

?       t

?       main.c

root@letuknowit:/home/kris/calc/trunk# svn propedit svn:ignore t/

svn: 't' is not under version control


导入文件到svn版本仓库

知道如何通过svn命令忽略文件后,下面通过svn st命令就只有一个main.c文件了,下面的工作就是将其添加到svn的文件仓库中

root@letuknowit:/home/kris/calc/trunk# svn st

?       main.c

root@letuknowit:/home/kris/calc/trunk# svn add main.c

A         main.c

root@letuknowit:/home/kris/calc/trunk# svn commit -m "add main.c"

Adding         trunk/main.c

Transmitting file data .

Committed revision 3.


通过svn add 文件名的方式将文件添加到svn的本地工作拷贝,再通过svn commit将其提交到svn的版本仓库中。通俗点说,就好比招聘,面试后面试官告诉你,录用你了,但是还是要等正式的录用合同签订后,你才正式属于公司的一员。

add的作用就是告诉文件我接纳你了,commit的作用就是签合同。

下面继续添加两个文件,为我们的计算器程序增加加法的功能。

root@letuknowit:/home/kris/calc/trunk# cat > add.h

int add(int lhs,int rhs);

^C

root@letuknowit:/home/kris/calc/trunk# cat > add.c

int add(int lhs,int rhs)

{

return lhs + rhs;

}

^C


main.c文件也需要做适当的修改了

#include <stdio.h>
#include "add.h"

int main()
{
printf("5 + 10 = %d.\n",add(5,10));
return 0;
}


编译、执行

root@letuknowit:/home/kris/calc/trunk# gcc -o calc main.c add.c

root@letuknowit:/home/kris/calc/trunk# ./calc

5 + 10 = 15.


下面再看看当前的本地副本状态

root@letuknowit:/home/kris/calc/trunk# svn st

?       add.c

?       add.h

M       main.c


新增了两个文件,下面把这两个文件也加到svn的版本仓库中

root@letuknowit:/home/kris/calc/trunk# svn add add.*

A         add.c

A         add.h


这里的*是通配符的作用,所有add.开头的文件都会被添加到版本库。

root@letuknowit:/home/kris/calc/trunk# svn commit -m "Support the addition operation"

Adding         trunk/add.c

Adding         trunk/add.h

Sending        trunk/main.c

Transmitting file data ...

Committed revision 4.


通过commit将本地修改提交到svn仓库,注意不同文件的处理方式(Adding和Sending)。

下面继续添加连个文件sub.h和sub.c,让我们的calc支持减法操作。

root@letuknowit:/home/kris/calc/trunk# cat > sub.h

int sub(int lhs,int rhs);

^C

root@letuknowit:/home/kris/calc/trunk# cat > sub.c

int sub(int lhs,int rhs)

{

return lhs - rhs;

}

^C


下面就是修改main.c文件,然后编译、运行

root@letuknowit:/home/kris/calc/trunk# vi main.c

root@letuknowit:/home/kris/calc/trunk# gcc -o calc main.c add.c sub.c

root@letuknowit:/home/kris/calc/trunk# ./calc

5 + 10 = 15.

15 - 10 = 5.


一切OK,下面看看svn工作副本的状态

root@letuknowit:/home/kris/calc/trunk# svn st

?       sub.h

?       sub.c

M       main.c


修改了一个文件,新添加两个文件

`root@letuknowit:/home/kris/calc/trunk# svn ci -m “Support the addition operation”

Sending trunk/main.c

Transmitting file data .

Committed revision 5.

root@letuknowit:/home/kris/calc/trunk# svn log main.c

————————————————————————

r5 | root | 2012-09-10 16:02:07 +0800 (Mon, 10 Sep 2012) | 1 line

Support the addition operation

————————————————————————

r4 | root | 2012-09-10 15:20:09 +0800 (Mon, 10 Sep 2012) | 1 line

Support the addition operation

————————————————————————

r3 | root | 2012-09-10 15:06:49 +0800 (Mon, 10 Sep 2012) | 1 line

add main.c

————————————————————————

`

糟糕,小手一抖,把main.c提交了,没有提交新添加的两个文件,而且更要命的是,日志信息写错了。

算了,先把没有添加的两个文件添加到svn版本仓库

root@letuknowit:/home/kris/calc/trunk# svn add sub.*

A         sub.c

A         sub.h

root@letuknowit:/home/kris/calc/trunk# svn ci -m "Support the subtraction operation"

Adding         trunk/sub.c

Adding         trunk/sub.h

Transmitting file data ..

Committed revision 6.


修改已经提交的日志信息

下面就来改改之前提交的日志信息,首先来看看当前的日志内容

root@letuknowit:/home/kris/calc/trunk# svn propget svn:log --revprop main.c -r 5

Support the addition operation


其中main.c是需要修改的是文件,-r指定需要修改的版本

svn的日志信息通过修改svn的默认属性svn:log来进行,代码如下

root@letuknowit:/home/kris/calc/trunk# svn propedit svn:log --revprop main.c -r 5

svn: Repository has not been enabled to accept revision propchanges;

ask the administrator to create a pre-revprop-change hook


提示有错误,需要管理员创建一个名为pre-revprop-change的钩子,好吧,那就建立个钩子吧,下面需要回到保存svn版本仓库的地方,其中有一个hooks文件夹。

root@letuknowit:/usr/local/svn/calc# cd hooks/

root@letuknowit:/usr/local/svn/calc/hooks# ls -al

total 44

drwxrwsr-x 2 root subversion 4096 2012-09-10 16:40 .

drwxrwsr-x 6 root subversion 4096 2012-09-06 17:53 ..

-rw-rwSr-- 1 root subversion 2022 2012-09-06 17:53 post-commit.tmpl

-rw-rwSr-- 1 root subversion 1663 2012-09-06 17:53 post-lock.tmpl

-rw-rwSr-- 1 root subversion 2344 2012-09-06 17:53 post-revprop-change.tmpl

-rw-rwSr-- 1 root subversion 1592 2012-09-06 17:53 post-unlock.tmpl

-rw-rwSr-- 1 root subversion 3510 2012-09-06 17:53 pre-commit.tmpl

-rw-rwSr-- 1 root subversion 2410 2012-09-06 17:53 pre-lock.tmpl

-rw-rwSr-- 1 root subversion 2818 2012-09-06 17:53 pre-revprop-change.tmpl

-rw-rwSr-- 1 root subversion 2100 2012-09-06 17:53 pre-unlock.tmpl

-rw-rwSr-- 1 root subversion 2852 2012-09-06 17:53 start-commit.tmplhooks


文件夹下默认放置了很多文件,这些都是临时文件,我们可以直接拷贝一份出来用,将tmpl后缀去掉

root@letuknowit:/usr/local/svn/calc/hooks# cp pre-revprop-change.tmpl pre-revprop-changeOK


继续执行下面命令修改日志信息

root@letuknowit:/usr/local/svn/calc/hooks# cd /home/kris/calc/trunk/

root@letuknowit:/home/kris/calc/trunk# svn propedit svn:log --revprop main.c -r 5

svn: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.


什么情况,还是不行?考虑到这个钩子都是一些脚本,是不是因为没有去权限呢,那好就去改下权限

root@letuknowit:/home/kris/calc/trunk# cd -

/usr/local/svn/calc/hooks

root@letuknowit:/usr/local/svn/calc/hooks# chmod 755 pre-revprop-change


改好权限,继续尝试修改日志信息

root@letuknowit:/usr/local/svn/calc/hooks# cd /home/kris/calc/trunk/

root@letuknowit:/home/kris/calc/trunk# svn propedit svn:log --revprop main.c -r 5


(这时候会出现一个编辑器,在其中将原先的内容进行修改,然后保存,看到下面的输出信息就说明操作成功了)

Set new value for property 'svn:log' on revision 5


好了,修改已经提交到svn的日志信息成功,下面检验一下成果吧。

`root@letuknowit:/home/kris/calc/trunk# svn log main.c

————————————————————————

r5 | root | 2012-09-10 16:02:07 +0800 (Mon, 10 Sep 2012) | 2 lines

Support the subtraction operation

r4 | root | 2012-09-10 15:20:09 +0800 (Mon, 10 Sep 2012) | 1 line

Support the addition operation

————————————————————————

r3 | root | 2012-09-10 15:06:49 +0800 (Mon, 10 Sep 2012) | 1 line

add main.c

————————————————————————`

冲突解决 合并别人的修改

在项目中,基本不可避免多个人同时参与一个项目,因此就可能会出现多个人同时修改一个文件的情况,就不可避免的会出现冲突。svn已经很聪明了,如果你和别人对于同一个文件的修改之间不存在重叠(比如你在文件最开始增加了一行,而你同事在文件的结尾出增加了一行),svn会自动将你们的修改进行合并,然而意外总是会发生,而且超出了svn的处理范围,只好采用人工智能(手工)来进行合并了。

要解决冲突,我们首先得制造个冲突,保证你现在已经有两个工作拷贝了,我们现在修改其中的一个,例如这里我们修改sally_calc中的main.c文件。

`root@letuknowit:/home/kris/sally_calc/trunk# cat main.c

#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
printf("5 + 10 = %d.\n",add(5,10));
printf("15 - 10 = %d.\n",sub(15,10));
//sally's test
printf("sally: 60 - 33 = %d.\n",sub(60,33));
return 0;
}


在这里sally增加了一个属于她自己的测试语句,改好后,提交到svn

root@letuknowit:/home/kris/sally_calc/trunk# svn ci -m "sally add some test code"

Sending        trunk/main.c

Transmitting file data .

Committed revision 7.


下面回到kris的工作副本,做类似的修改,具体如下

root@letuknowit:/home/kris/calc/trunk# cat main.c


#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
printf("5 + 10 = %d.\n",add(5,10));
printf("15 - 10 = %d.\n",sub(15,10));
//kris's test
printf("kris: 12 + 28 = %d.\n",add(12,28));
return 0;
}


好了,下面的工作自然是提交了。

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"

Sending        trunk/main.c

svn: Commit failed (details follow):

svn: File '/trunk/main.c' is out of date


很抱歉,提交失败了,原因是本地文件过期了(因为之前sally提交了对于main.c的修改)。原来如此,赶紧把sally的修改update过来。不过在这之前提供一个检测本地文件是否已经过期的办法,还记得经常用到的svn st命令吧

root@letuknowit:/home/kris/calc/trunk# svn st

M       main.c

root@letuknowit:/home/kris/calc/trunk# svn st -u

M       *        6   main.c

Status against revision:      7


看到那个*了吧,出现这个标记就说明本地副本的文件已经过期了,需要执行svn update了。

root@letuknowit:/home/kris/calc/trunk# svn up

Conflict discovered in 'main.c'.

Select: (p) postpone, (df) diff-full, (e) edit,

(mc) mine-conflict, (tc) theirs-conflict,

(s) show all options:


额滴个小心脏啊,又出错了,还要做选择题,纠结啊,纠结前还是看看各个选项都是做啥的吧

(p) postpone          暂时推后处理,我可能要和那个和我冲突的家伙商量一番
(df) diff-full        把所有的修改列出来,比比看
(e) edit              直接编辑冲突的文件
(mc) mine-conflict    如果你很有自信可以只用你的修改,把别人的修改干掉
(tc) theirs-conflict  底气不足,还是用别人修改的吧
(s) show all options  显示其他可用的命令


这里我们先选择p稍候处理,系统会给出如下输出,main.c前面的C标识说明这是一个冲突中的文件,需要手工处理以解决冲突。

(s) show all options:p

C    main.c

Updated to revision 7.

Summary of conflicts:

Text conflicts: 1


如果这个时候你查看一下工作拷贝,你会发现多了几个文件,对于每一个冲突的文件,svn会放置三个额外的未版本化文件到你的工作拷贝。

root@letuknowit:/home/kris/calc/trunk# ls -al m*

-rw-r--r-- 1 root root 312 2012-09-20 16:35 main.c

-rw-r--r-- 1 root root 216 2012-09-20 16:35 main.c.mine

-rw-r--r-- 1 root root 156 2012-09-20 16:35 main.c.r6

-rw-r--r-- 1 root root 218 2012-09-20 16:35 main.c.r7


其中main.c.mine是融合了你的修改的版本,里面是你更新的内容,main.c.r6是你做更新操作以前的版本,你是在这个版本的基础上做的修改,main.c.r7是版本库中的最新版本,这里有别人的修改,而就是这个修改和你的修改冲突了。这几个文件可以自己去查看下,应该很好理解。

对了,还有主角没有登场,这个时候如果你看下mian.c的内容,估计你又要郁闷了,和你原先的修改完全不一样了。

root@letuknowit:/home/kris/calc/trunk# cat main.c


#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
printf("5 + 10 = %d.\n",add(5,10));
printf("15 - 10 = %d.\n",sub(15,10));
<<<<<<< .mine
//kris's test
printf("kris: 12 + 28 = %d.\n",add(12,28));
=======
//sally's test
printf("sally: 60 - 33 = %d.\n",sub(60,33));
>>>>>>> .r7
return 0;
}


你会看到由小于号、等于号和大于号串组成的三个部分,其中小于号和等号之间的内容是你的修改,而等号和大于号之间的修改是其他人的修改,在明确了冲突的原因之后,我们已经知道怎么修改了,两个人的修改都是需要保留的。

OK,那就保留所有的修改,删除掉<、=和>,最后的结果如下。

小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除。

root@letuknowit:/home/kris/calc/trunk# cat main.c


#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
printf("5 + 10 = %d.\n",add(5,10));
printf("15 - 10 = %d.\n",sub(15,10));
//kris's test
printf("kris: 12 + 28 = %d.\n",add(12,28));
//sally's test
printf("sally: 60 - 33 = %d.\n",sub(60,33));
return 0;
}


冲突解决了,下面的工作就是通知svn,我们已经把冲突搞定了(使用svn resolved命令),下面该你了,可以看到svn将生成的几个临时文件删除了。

root@letuknowit:/home/kris/calc/trunk# svn resolved main.c

Resolved conflicted state of 'main.c'

root@letuknowit:/home/kris/calc/trunk# ls -al m*

-rw-r--r-- 1 root root 278 2012-09-20 17:07 main.c


接下来提交代码,搞定收工。

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"

Sending        trunk/main.c

Transmitting file data .

Committed revision 8.


diff输出格式详解

在冲突解决一节结束后,我们的main.c文件的内容如下

1 #include <stdio.h>
2 #include "add.h"
3 #include "sub.h"
4
5 int main()
6 {
7         printf("5 + 10 = %d.\n",add(5,10));
8         printf("15 - 10 = %d.\n",sub(15,10));
9         //kris's test
10         printf("kris: 12 + 28 = %d.\n",add(12,28));
11         //sally's test
12         printf("sally: 60 - 33 = %d.\n",sub(60,33));
13         return 0;
14 }


下面,我们做一些修改,具体如下

1 #include <stdio.h>
2 #include "add.h"
3 #include "sub.h"
4
5 int main()
6 {
7         printf("5 + 10 = %d.\n",add(5,10));
8         printf("15 - 10 = %d.\n",sub(15,10));
9         //kris's test
10         printf("kris: 32 + 28 = %d.\n",add(32,28));
11         printf("kris: 15 - 10 = %d.\n",sub(15,10));
12         //sally's test
13         printf("sally: 60 - 33 = %d.\n",sub(60,33));
14         return 0;
15 }


修改完后,调用svn diff命令,会有如下的输出,下面就说说输出中各部分的意思。

root@letuknowit:/home/kris/calc/trunk# svn diff main.c


Index: main.c
===================================================================
--- main.c      (revision 8)
+++ main.c      (working copy)
@@ -7,7 +7,8 @@
printf("5 + 10 = %d.\n",add(5,10));
printf("15 - 10 = %d.\n",sub(15,10));
//kris's test
-       printf("kris: 12 + 28 = %d.\n",add(12,28));
+       printf("kris: 32 + 28 = %d.\n",add(32,28));
+       printf("kris: 15 - 10 = %d.\n",sub(15,10));
//sally's test
printf("sally: 60 - 33 = %d.\n",sub(60,33));
return 0;Index: main.c


svn diff可以查看当前工作拷贝中所有的被修改的文件,对于每个文件的diff输出部分由Index: 文件名的形式进行区分。

等于号后面的内容就是关于main.c文件的diff情况了。

--- main.c      (revision 8)

+++ main.c      (working copy)


— 打头的是原始文件,也就是版本库中的最新版本,或者理解为修改前的文件

+++ 打头的是目标文件,这个就是你修改后的版本

@@ -7,7 +7,8 @@


这里的-和+分别表示原始文件和目标文件,7,7表示从第7行开始的7行,-7,7就是原始文件的从第7行开始的7行内容,+7,8的意思类似,表示目标文件从第7行开始的8行内容。结合起来理解就是:

目标文件从第7行开始的8行内容和原始文件的从第7行开始的7行内容之间存在差异

printf("5 + 10 = %d.\n",add(5,10));
printf("15 - 10 = %d.\n",sub(15,10));
//kris's test
-       printf("kris: 12 + 28 = %d.\n",add(12,28));
+       printf("kris: 32 + 28 = %d.\n",add(32,28));
+       printf("kris: 15 - 10 = %d.\n",sub(15,10));
//sally's test
printf("sally: 60 - 33 = %d.\n",sub(60,33));
return 0;


这个就是具体的差异情况了,前面的-号表示需要从原始文件中删除的行,+号表示目标文件中将要增加的行,-号开头的部分只属于原始文件,+号开头的部分只属于目标文件,其余的是两者相同的部分。

1   1         printf("5 + 10 = %d.\n",add(5,10));
2   2         printf("15 - 10 = %d.\n",sub(15,10));
3   3         //kris's test
4     -       printf("kris: 12 + 28 = %d.\n",add(12,28));
4 +       printf("kris: 32 + 28 = %d.\n",add(32,28));
5 +       printf("kris: 15 - 10 = %d.\n",sub(15,10));
5   6         //sally's test
6   7         printf("sally: 60 - 33 = %d.\n",sub(60,33));
7   8         return 0;


为了进一步了解@@ -7,7 +7,8 @@的意思,上面加上了行号等信息,第一列的数字是行号,后面两列的数字表示第几行。经过标注可以清晰的看出原始文件第7行开始的7行和目标文件第7行开始的8行内容了。

changelist命令的使用

svn changelist(也可以简写为cl)是一个对本地副本库的文件进行分组的命令,它可以作为其它命令的参数,但是它仅仅是本地副本库的一个分组,不能在库中传播以及与其它用户分享。

还是以之前的计算器程序为例,首先我们简单修改下工作副本中的几个文件(在add.c add.h sub.c sub.h几个文件最后都加入一个空行)

root@letuknowit:/home/kris/calc/trunk# svn st

M       sub.h

M       add.c

M       sub.c

M       add.h


好了,做好改动后就要进行提交了,但是又不想把这四个文件一起提交,想把add的分为一组,sub的分为一组,这时候svn changelist就派上用场了。

root@letuknowit:/home/kris/calc/trunk# svn cl add add.*

Path 'add.c' is now a member of changelist 'add'.

Path 'add.h' is now a member of changelist 'add'.

root@letuknowit:/home/kris/calc/trunk# svn cl sub sub.c sub.h

Path 'sub.c' is now a member of changelist 'sub'.

Path 'sub.h' is now a member of changelist 'sub'.


上面的add和sub都是组名,其后是需要加入到改组中的文件,多个文件以空格隔开,支持通配符(例如那个add.*)。完成以上工作后,再通过svn st看看有什么变化

`root@letuknowit:/home/kris/calc/trunk# svn st

— Changelist ‘add’:

M add.c

M add.h

— Changelist ‘sub’:

M sub.h

M sub.c`

删除组中的文件也比较简单,具体如下

`root@letuknowit:/home/kris/calc/trunk# svn cl –remove sub.c

Path ‘sub.c’ is no longer a member of a changelist.

root@letuknowit:/home/kris/calc/trunk# svn st

M sub.c

— Changelist ‘add’:

M add.c

M add.h

— Changelist ‘sub’:

M sub.h`

由于每个文件只能属于一个组,因此在将某个文件从某个组中删除的时候,无需指定组名。

changelist作为参数

Index: sub.h
===================================================================
--- sub.h       (revision 6)
+++ sub.h       (working copy)
@@ -1 +1,2 @@
int sub(int lhs,int rhs);
+
Index: sub.c
===================================================================
--- sub.c       (revision 6)
+++ sub.c       (working copy)
@@ -2,3 +2,4 @@
{
return lhs - rhs;
}
+


其他支持svn changelist的指令包括:changelist、commit、info、propdel、propget、proplist、propset、revert、status、update

将已在一个组中的文件加入另一个组

`root@letuknowit:/home/kris/calc/trunk# svn cl add sub.c

svn: warning: Removing ‘sub.c’ from changelist ‘sub’.

Path ‘sub.c’ is now a member of changelist ‘add’.

root@letuknowit:/home/kris/calc/trunk# svn st

— Changelist ‘add’:

M add.c

M sub.c

M add.h

— Changelist ‘sub’:

M sub.h`

由于每个文件在同一个工作拷贝中只能加入一个分类,在讲某个文件加入新的分组之前,会将其从原先的分组中删除。

对于未在svn版本控制下的文件,无法加入分组

root@letuknowit:/home/kris/calc/trunk# touch newfile
root@letuknowit:/home/kris/calc/trunk# svn st
?       newfile

--- Changelist 'add':
M       add.c
M       sub.c
M       add.h

--- Changelist 'sub':
M       sub.h
root@letuknowit:/home/kris/calc/trunk# svn cl add newfile
svn: warning: 'newfile' is not under version control


svn changelist不允许将文件夹加入某个分组,但是可以将多个不同的文件夹中的文件归为一组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: