svn常见操作

文章目录


svn大多数人都会,有些命令是可以深入的。


1. svn服务器搭建,

可以参考/home1/qilei/SVN/create_svn_cangku.sh脚本。基本说来是三步。

1.1 建立svn。svnadmin create

1.2 配置svn。 conf

1.3 启动svnserve服务。svnserve -d -r ./

举例

项目名称叫MyProject

  1. svnadmin create MyProject
  2. 编辑./MyProject/conf/svnserve.conf文件,目的是设置基本的svn参数
    [general]
    anon-access = none
    auth-access = write
    password-db = passwd
    authz-db = authz
    realm = welcom to MyProject
  3. 编辑./MyProject/conf/authz文件,目的是增加用户名及其可读写权限。
    [/]
    jones = rw
    admin = rw
    qilei = rw
  • = r
  1. 编辑./MyProject/conf/passwd文件,目的是设置用户的访问密码
    [users]
    jones = jones123
    admin = admin123
    qilei = qilei123
  2. 在MyProject的上一级目录下,执行命令svnserve -d -r ./;目的是启动svn服务器服务。

其中,anon-access = none和* = r;这两个地方,要注意按部就班的写吧。因为如果依赖默认的话,anon-access = read和* = r,看网上的说法,老版本的svn是有bug的(不过经过实践,svn 1.7.14版本是没有这个bug的)。


2. svn help/版本/username

2.1 svn help command

有需求,基本思路,从内容里查找自己有用的信息。

2.2 -r 600

指定版本号600

2.3 -r 600:611

指定版本号600到611的范围。

2.4 -r 600:HEAD

指定版本号从600开始到最新版本

2.5 svn --username qilei --password 123456

默认用户名密码是缓存到本地的。大都遇到这样的情况,liaojian有一个与我负责IP相关的bug,经debug后,认定要提交svn ci,如果不添加参数–username qilei,就使用的liaojian本地缓存的用户名提交代码,造成svn log的混乱。如果添加参数–username qilei --password 123456,就会污染liaojian本地用户名密码的缓存


3. svn clean

主要是解决svn lock问题。


4. svn co svn://192.168.2.100/XXX

4.1 checkout版本162

svn co svn://192.168.2.100/XXX -r 162

4.2 只checkout XXX这一层,内部目录不checkout。

svn co svn://192.168.2.100/XXX -N

4.3 只checkout文件夹XXX/simulation

svn co svn://192.168.2.100/XXX/simulation

4.4 只checkout文件,比如netlist快捷符。(svn只能checkout某个文件夹)

svn co svn://192.168.2.100/XXX -N

4.5 checkout到本地并改名为qilei目录

svn co svn://192.168.2.100/XXX -N qilei


5. svn commit -m “xxxxxxxx”

如果换行,可以
svn commit -m “xxxxxxxx
yyyyyy
zzzz”

6. svn cp

一般用于svn 分支使用。这个cp是极好的,因为它是廉价复制,对空间消耗极小;本地看起来是真正的拷贝,服务器上基本没有任何空间增加。
svn的delete和copy都不是普通的删除和复制
svn的delete只是做了个标记,在客户端获取新版本时不出现这些被删除的文件,而文件本身在服务器端仍然是存在的,而且可以通过更新到原来的某个版本找回这些文件
svn的copy也只是在服务器端做个类似指针的映射,在服务器端并不重复存储这些文件,对服务器端的存储空间消耗极小
svn的分支和标签用的都是svn copy

7. svn delete

删除目录或者文件,
然后svn ci提交。


8. svn diff

8.1 svn diff aaaa.v -r 611

与611版本的aaaa.v做diff比较。

8.2 svn diff可以支持gvimdiff的。

但是会影响整个主目录下的svn diff;有时候脚本命令会用到svn diff。建议,还是保留svn diff。

9. svn info

显示svn的信息,包含版本号、URL、last changed author等。
与svn switch URL经常配套使用。确认当前svn的branch。
经常用svn info命令,解决很多不常见的svn操作错误。这个命令,值得拥有。


10. svn list(我一般使用svn ls)查看当前目录下的svn文件。类似linux的ls命令。


11. svn log

11.1 svn log -v

打印日志,包含代码改动的文件名列表。

11.2 svn log -v -r 611::600

611版本与600版本之间的版本改动记录。

12. svn mv

重命名
svn mv XXX/design/IP XXX/design/IP_OLD
配合svn ci XXX/design/IP -m “update IP”,就可以提交新IP代码了。


13. svn revert

举例,如果svn add aaaa.v之后,发现aaaa.v没有必要提交。
可以使用svn revert aaaa.v,取消掉svn add aaaa.v命令。
类似的svn delete aaaa.v,也可以。
svn revert目录,要加入–depth参数,比如
svn revert XXX --depth infinity


14. svn st的某些状态不理解意思。

svn help st已有详细描述。


15. svn up时遇到冲突,怎么办?

$ svn update
U INSTALL
G README
Conflict discovered in ‘bar.c’.
Select: § postpone, (df) diff-full, (e) edit,
(h) help for more options:

个人认为,直接ctrl+c,然后对bar.c进行svn st检查冲突原因。不需要明白select的各命令意义。
善用gvimdiff,可以写个简单脚本,实现一个gvimdiff版本的svn diff操作。

16. 常见问题

16.1. 本地代码更新较多,存在bug,暂时不能上传。但是要求继续使用代码版本维护。

在svn中标签和分支都源于copy命令。
3个约定俗成的目录:
trunk:主干
branches:分支
tags:标签

推荐svn层次分为2个大目录
svn_name/trunk:主干。公用的稳定版本

svn checkout svn://192.168.2.100/svn_name/trunk

svn_name/branches:分支目录

发布分支:

svn cp svn://192.168.2.100/svn_name/trunk/project_name svn://192.168.2.100/svn_name/branches/project_name -m "创建用于本地的分支"

切换分支:
主干版本:

svn switch svn://192.168.2.100/svn_name/trunk/project_name

分支版本:

svn switch svn://192.168.2.100/svn_name/branches/project_name

注意:稳定版和开发版,不要搞错了。以后再开发版进行操作。

本地代码经过验证成功后,通过merge操作,提交至最新的svn服务器。
合并分支需要两个步骤:
合并操作
首先,切换到需要merge后提交的版本,比如主干版本或者分支版本,一般是分支版本的代码merge到主干版本。

svn switch svn://192.168.2.100/svn_name/trunk/project_name
svn merge -r 33:HEAD svn://192.168.2.100/svn_name/branches/project_name
解决merge问题后,最后提交
svn ci

参考文档:
SVN中Branch的创建与合并 - 黄博文 - 博客园
http://www.cnblogs.com/huang0925/p/3254243.html

16.2. 有些人不规范,利用mv指令修改名称,导致错误。

例如
svn add yyy
svn提示:yyy已经在版本控制里。
原因解析:版本控制里,其实并没有yyy,但是svn info yyy,会发现yyy本身的svn URL是另外一个名字(例如xxx),而且这个xxx名字文件确实是在版本控制里。
还有一种可能的原因,是yyy目录里有.svn。
总之,svn info yyy,只有说明yyy不是一个版本资源,就可以执行后续svn add yyy 了。
解决办法:svn info yyy;svn delete xxx;然后svn add yyy

16.3.代码提交不整洁

不相关的文件,甚至临时文件都做了上传。

16.4.项目不同阶段,会设置不同用户权限

16.5.在我的工程里有一个文件,每个人都必须改变它,但是我不希望他们本地的修改被提交,如何让’svn commit’忽略这个文件?

答案是:不要将文件纳入版本控制,而是将文件的模板纳入版本控制,例如“file.tmpl”。
然后,在初始化的‘svn checkout’之后,让你的用户(或你的构建系统)执行通过普通的操作系统复制将文件修改为正确的文件名,文件未版本化,所以绝不会提交。并且如果你希望,你可以将文件加入到父目录的svn:ignore属性中,这样它就不会在‘svn status’命令中显示‘?’。

16.6.sim_gpu的仿真环境,已经执行过,里面有很多临时文件,怎么拷贝一个新的干净的最新svn版本的sim_gpu

暂时想到的办法是,svn co svn://192.168.2.100/xxx/sim_gpu sim_gpu2

16.7.svn服务器推荐的目录布局(特指单一项目的svn维护)

结合svn branch和tag去理解。

/XXX_project
   trunk/
      design/
      simualtion
   tags/
      formal_v1.0/
   branches/
      branch_v0.01/
	      design/
	      simualtion      
      branch_v0.02/
      branch_v0.03/

16.8.svn的文件内容尽量精简

svn的目录布局,增加一些common目录

16.9. svn怎么忽略特定文件或者文件夹

svn propset svn:global-ignore "worklib" .

svn操作会忽略当前目录下的worklib文件或者文件夹。
注意后面的点符号,表示当前路径;这是svn propset语法要求的。

svn ignore忽略文件夹的内容

svn propset svn:global-ignore '*' worklib

查看当前忽略的文件或者文件夹?
解答:svn propget svn:global-ignore

16.20 删除文件或者目录

svn delete,然后svn ci -m ""

16.20. 如何更换同名的目录或者链接符号

svn mv,然后svn ci -m ""

svn相对git的缺点

  1. svn分服务端和客户端。如果服务端数据挂了,依赖客户端是无法获取svn log信息的。
  2. svn做本地代码维护时,也需要提交版本给服务端。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中进行SVN操作,你可以使用第三方库`svn-python`或`pysvn`。这些库提供了与SVN版本控制系统进行交互的功能。以下是一些常见SVN操作示例: 1. 检出(Checkout)SVN仓库: ```python import pysvn def checkout_svn_repository(url, dest): client = pysvn.Client() client.checkout(url, dest) # 示例用法 checkout_svn_repository('http://svn.example.com/repo/trunk', '/path/to/destination') ``` 2. 更新(Update)已检出的SVN仓库: ```python import pysvn def update_svn_repository(dest): client = pysvn.Client() client.update(dest) # 示例用法 update_svn_repository('/path/to/destination') ``` 3. 提交(Commit)更改到SVN仓库: ```python import pysvn def commit_svn_repository(dest, message): client = pysvn.Client() client.checkin(dest, message) # 示例用法 commit_svn_repository('/path/to/destination', '提交更改的描述') ``` 4. 添加(Add)文件或目录到SVN仓库: ```python import pysvn def add_to_svn_repository(dest): client = pysvn.Client() client.add(dest) # 示例用法 add_to_svn_repository('/path/to/new_file.txt') ``` 5. 删除(Delete)文件或目录从SVN仓库: ```python import pysvn def delete_from_svn_repository(dest): client = pysvn.Client() client.remove(dest) # 示例用法 delete_from_svn_repository('/path/to/file.txt') ``` 这些代码示例使用`pysvn`库,你可以使用`pip install pysvn`命令来安装它。请注意,你可能还需要安装Subversion客户端以便与SVN版本库进行通信。 另外,`svn-python`库也提供了类似的功能。你可以通过`pip install svn`命令来安装它。使用该库的示例代码与`pysvn`类似,只需将导入语句更改为`import svn.remote`并相应地调整函数调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值