您的位置:首页 > 其它

版本控制(四)--mac使用自带svn(命令行)

2014-12-12 16:54 495 查看

前言

在Mac环境下,由于Mac自带了svn的功能,所以我们可以在不装任何第三方软件的前提下使用svn功能(svn服务器的话不过还需做一下简单的配置)。

另看到一篇文章(http://benohead.com/mac-os-x-svn-subversion-missing-in-mountain-lion-10-8/)说老版的mac os x系统svn功能集合在xcode中,Preferences > Downloads > Command Line Tools 里面。

检查系统是否安装了svn,opening a Terminal and typing the following: svn --version

Copyright (C) 2014 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/ 
The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebD*** protocol using Neon.
  - handles 'http' scheme
  - handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
* ra_serf : Module for accessing a repository via WebD*** protocol using serf.
  - handles 'http' scheme
  - handles 'https' scheme
可以使用如下命令确定我们的Mac OS系统确实已经安装了svnserve:svnserve --version
svnserve, version 1.7.17 (r1591372)
   compiled Aug  7 2014, 17:03:25

Copyright (C) 2014 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/ 
The following repository back-end (FS) modules are available:

* fs_fs : Module for working with a plain file (FSFS) repository.


搭建svn服务器

创建仓库

1.若你的机器是首次进行svn的搭建创建svn目录。

在终端中输入:mkdir /Users/username/svn 回车(若有提示,很有可能你的电脑已经存在了svn文件夹,若你不使用,可将其删除再重新运行上面命令)

2.创建svn repository

在终端中输入:svnadmin create /Users/username/svn/repository

3.查看svn repository下的文件(有利于你理解svn)终端中输入:ls/Users/username/svn/repository/ 下面六个文件(README.txt db hooks conf format locks)


基本配置

主要是修改/svn/mycode/conf目录下的三个文件:authz passwd svnserve.conf

1.打开svnserve.conf,将下列配置项前面的#和空格都去掉:

# anon-access = read
……
# auth-access = write
……
# password-db = passwd
……
# authz-db = authz
anon-access = read代表匿名访问的时候是只读的,若改为anon-access = none代表禁止匿名访问,需要帐号密码才能访问。

2.打开passwd,在[users]下面添加帐号和密码:

……
[users]
username1 = userpassword
# sally = sallyssecret
……
3打开authz,配置用户组和权限

……
[groups]
admin = administrator
user = xiayong,zhangsan
[/]
@admin = rw
@user = r
[local:/]
@admin = rw
@user = r
……

说明:

1.在[groups]下面添加组名和用户名,多个用户之间用逗号(,)隔开

2.使用[/]代表svn服务器中的所有资源库,即username/svn/repository目录。

3.组名前面要用@,如果是用户名,不用加@,比如xiayong这个用户有读写权限[/] xiayong=rw

4.[local:/]表示repository目录下local仓库根目录

4.启动svn服务器

在终端输入下列指令:svnserve -d -r /Users/username/svn
或者输入:svnserve -d -r /Users/username/svn/repository
没有任何提示,说明启动成功

5.关闭svn服务器

如果你想要关闭svn服务器,最有效的办法是打开实用工具里面的“活动监视器”,搜索“svn”,找到svnserve线程,退出即可。

如无特殊说明,以下命令,均是在svn目录下(即workcopy目录)下操作

服务器端操作

使用命令:svn ls [sever path],即可查看sever path下的目录了

1.从本地导入代码到服务器(第一次初始化导入)

svn import /Users/apple/Documents/eclipse_workspace/weibo svn://localhost/mycode/weibo --username=mj --password=123 -m "初始化导入"
说明:将/Users/apple/Documents/eclipse_workspace/weibo中的所有内容,上传到服务器mycode仓库的weibo目录下,后面双引号中的"初始化导入"是注释;

*1.import命令中 前者path,后者url,注意linux命令风格,如果前者是一个文件的话,后者url可以是文件或者目录(即使你写的.../direction/结尾,也会认为是文件,导入一个direction的文件)

*2.import命令中前者path,如果是一个目录的话,那后面一定会当成一个目录

2.从服务器端下载代码到客户端本地

svn checkout svn://localhost/mycode --username=mj --password=123 /Users/apple/Documents/code
说明:将服务器中mycode仓库的内容下载到/Users/apple/Documents/code目录中

使用svn客户端功能

.版本管理
svn export [-r REV] URL[@PEGREV] [PATH]
svn export [-r REV] PATH1[@PEGREV] [PATH2]
别名:无
描述:导出一个干净的目录树,不包含所有的受控信息。可以选择从URL或WC中导出。
访问库:如果访问的是URL则会。
eg:svn export file:///var/svn/repos my-export   ##导出到my-export目录

添加文件
svn add test.txt 添加单一文件
svn add *.* 添加所有文件
svn add *.php 添加所有后缀为php的文件

提交文件
svn ci -m “描述(可留空)” 文件名 提交单一文件
svn ci -m “描述(可留空)” 提交所有文件

删除文件
svn delete 文件名
简写:svn (del, remove, rm)

加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
svn unlock -m “LockMessage“ [--force] PATH

svn update,简写 svn up
svn update 更新所有文件
svn update -r 200 test.php (将版本库中的文件test.php还原到版本200)
svn update test.php (更新单一文件,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)

将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

svn revert 本地修改回滚:
svn revert [-R] sth
其中sth可以是(目录或文件的)相对路径也可以是绝对路径。
当sth为单个文件时,直接svn revert sth就行了;当something为目录时,需要加上参数-R(Recursive,递归),否则只会将something这个目录的改动。
在这种情况下也可以使用svn update命令来取消对之前的修改,但不建议使用。因为svn update会去连接仓库服务器,耗费时间。
注意:svn revert本身有固有的危险,因为它的目的是放弃未提交的修改。一旦你选择了恢复,Subversion没有方法找回未提交的修改。

svn resolved PATH...
别名:无
描述:将冲突的文件标记为已解决,并且删掉冲突产生的临时文件。注意这个命令并不是能把冲突解决,解决冲突还是得靠人工。

查看文件详细信息
svn info 文件名

查看日志
svn log 文件名

svn status [path]其字符的含义如下:
简写:svn st

查看差异
svn diff(di) path
例如:svn diff test.php(本地修改差异)
svn diff -r m:n path(对版本m和版本n比较差异)

各命令说明:

1.后面大多接path(直接文件名就是当前目录下文件)

2.svn info不带路径,也可以查看该workcopy的各种信息,包括仓库url等信息;

3.检查workcopy修改,常用svn status浏览所做的修改,通过svn diff检查修改的详细信息。另,这俩个命令和svn revert都可以在没有网络的情况下使用;



4.冲突的解决:冲突发生时,subversion会在当前工作目录中保存所有的目标文件版本{上次更新版本、当前获取的版本(即别人提交的版本)、自己更新的版本、目标文件}

conflict.txt.r101 //服务器上初始版本(head)
conflict.txt.r102 //别人在你之前提交的版本
conflict.txt.mine //自己修改后准备提交的版本(work copy)
conflict.txt      //自动合并了你的版本和别人提交的版本形成的(其中用<<<<<、======、>>>>>等符号标记出了自动合并的部分(合并后的work copy)
三种方式解决冲突:

A、放弃自己的更新,使用svn revert(回滚),然后提交。在这种方式下不需要使用svn resolved(解决);

B、放弃自己的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交。

$ svn update
C  sandwich.txt
Updated to revision 2.
$ ls sandwich.*
sandwich.txt  sandwich.txt.mine  sandwich.txt.r2  sandwich.txt.r1
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt
C、手动解决:冲突发生时,通过和其他用户沟通之后,手动更新目标文件。然后执行resolved filename来解除冲突,最后提交。

5.代码回滚:

A.第一种情况:改动没有被提交(commit)。这种情况下,使用svn revert就能取消之前的修改。详见上文命令解释;

B.第二种情况:改动已经被提交(commit)。这种情况下,用svn merge命令来进行回滚。

1. svn update,svn log,找到最新版本(latest revision)

2. 找到自己想要回滚的版本号(rollbak revision)

3. 用svn merge来回滚: svn merge -r : something

eg:

//1.保证我们拿到的是最新代码:
svn update  //假设最新版本号是28。
//2.然后找出要回滚的确切版本号:
svn log [something] //假设根据svn log日志查出要回滚的版本号是25,此处的something可以是文件、目录或整个项目
//如果想要更详细的了解情况,可以使用svn diff -r 28:25 [something]
//3.回滚到版本号25:
svn merge -r 28:25 something  //为了保险起见,再次确认回滚的结果:
svn diff [something] //发现正确无误,提交。
//4.提交回滚:
svn commit -m "Revert revision from r28 to r25,because of ..."
//提交后版本变成了29。


6.文件夹操作

svn中添加/删除文件夹 跟 文件不一样,对于文件操作相对简单一点。如上文所讲,添加/删除文件的话,svn st,出现A/D flag ,svn ci提交即可。而文件夹删除/添加后会出现?或者!的flag ,先得svn add 或者delete命令之后,再svn ci 命令提交

文件夹添加操作

方法一:先添加单独的文件夹,这时svn st,文件夹出现?flag,之后使用svn add命令,将文件夹添加到svn,在svn ci。之后在往文件夹添加文件等操作。

方法二:将文件夹和里面的文件一起添加到workcopy中去,待测试?

文件夹删除操作:

在xcode项目中删除文件夹不同于删除文件,删除文件夹后,磁盘上还存在,在磁盘上删除后,svn st 显示“!”,使用svn delete 命令之后,在ci。

----------------------------------------

参考:

http://blog.csdn.net/zjl201309/article/details/14051271 :Mac下搭建svn服务器教程(终端与 Xcode的使用)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐