目录
SVN介绍
Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
SVN中的一些概念:
- repositoty (源代码库):源代码统一存放的地方
- checkout (提取):当你手上没有源代码时,需要从repository checkout一份
- commit(提交):当你已经修改了代码,你就需要commit到repository
- update(更新):当你已经checkout了一份源代码,update一下你就可以核repository上的源代码同步,你手上的代码就会有最新的变更
如果两个程序员同时修改了同一个文件, SVN 可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。
SVN的优点:
- 原子提交。一次提交不管是单个还是多个文件,都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏。
- 重命名、复制、删除文件等动作都保存在版本历史记录当中。
- 对于二进制文件,使用了节省空间的保存方法。(简单的理解,就是只保存和上一版本不同之处)
- 目录也有版本历史。整个目录树可以被移动或者复制,操作很简单,而且能够保留全部版本记录。
- 分支的开销非常小。
- 优化过的数据库访问,使得一些操作不必访问数据库就可以做到。这样减少了很多不必要的和数据库主机之间的网络流量。
Windows下SVN的使用
1. 了解 SVN 客户端、服务端
SVN 分为客户端、服务端,SVNBucket 就是一个 SVN 的服务端,负责托管 SVN 的代码。
我们需要使用 SVN 的客户端来跟服务端打交道。
在 Windows 上,我们推荐使用 TortoiseSVN,可视化的操作界面,集成右键菜单,非常方便。
2. TortoiseSVN 介绍
也叫乌龟SVN,是当前 Windows 上最流行的 SVN 客户端,没有基础的人也能快速的学会
如果你还没有 TortoiseSVN 可以查看 TortoiseSVN安装和汉化教程
更多其他 SVN客户端下载
下面我们就以 TortoiseSVN 作为客户端来讲解如何使用,服务端我们使用 SVNBucket
3. Checkout检出代码
- 在SVNBucket的项目详情-源码页面-复制SVN地址
- 在你需要保存代码的地方右键选择
SVN Chekout...
- 填写SVN地址,填写保存目录,输入SVNBucket网站登录用户名密码。
- 点击确定就能同步代码到本地了。
4. Update更新代码
右键 SVN Update 更新代码,这样就能把其他人提交的代码同步到自己电脑上了
5. Commit提交代码
提交代码也很简单,右键SVN Commit...
,填入提交描述,就可以把本地提交的代码提交到服务器了。
在提交代码前我们应该update
下代码,这是个好习惯,可以避免覆盖别人的代码和代码冲突。
6. 忽略文件
有时候某些目录或者文件我们不想提交到 SVN 服务器,这时我们可以忽略这些文件。
下面演示忽略 temp 目录和 *.map 文件
撤销忽略,文件的操作方式步骤是一样的,目录的有点不一样,请看下面演示
7. 撤销本地修改
有时候我们本地修改了一些文件,但是突然又不需要了,想丢弃本地的修改回去SVN上最新的版本怎么操作呢?
右键选中需要撤销的文件,TortoiseSVN->Revert 就可以丢弃本地修改了。
8. 撤销已经提交的代码
已经提交到SVN仓库的代码发现改错了,还能后悔撤回吗?
- 右键TortoiseSVN ==> show log 查看提交记录
- 选择我们需要回去的版本,右键选择
Revert to this version
,这样就回去了指定的版本 - 最后你还需要
commit
下撤销后的代码到SVN仓库
9. SVN仓库目录和开发建议
我们建议每个仓库的根目录都创建trunk、branches、tags目录,这是经典的 SVN 目录结构,方便开发和维护
个人比较喜欢的开发模式是,开发时都在trunk
写代码,上线产品后就创建分支到branches
目录,线上版本出问题了,我们应该在对应的分支上进行修复,并且把修复后的代码合并到主干上。
10. 如何创建分支
以上面的目录结构为例子,我们从当前主干创建一个分支出去,表示1.0版本,操作步骤如下:
- 右键 trunk 目录 => 右键TortoiseSVN => Branch/tag
- 填写分支路径
/branches/online1.0
,填写注释,选择最用最新的版本开分支,如下:
11. 如何合并代码
假设我们在分支上修复了一个线上的BUG,需要把代码那个代码合并到主干来,操作步骤:
- 在分支的跟目录点击
show log
- 选中需要合并过去主干的提交记录(可以多选)
- 点击
merge revision to ...
- 选择主干的跟目录,点击确定,就合并过去了。
- 在主干上提交这次合并的内容
SVN 的这个指定提交记录合并功能非常的方便,我们日常中经常会遇到线上出问题需要修复,修复后把代码合并到主干的情况。
注意:你在分支上的什么目录点击合并,那就需要定位到主干的对应目录合并,不然会出错。
另外如果你有大量的代码需要合并或者不知道哪些提交记录需要合并,可以使用Beyond Compare
来进行对比合并,也是非常方便的,视频教程使用BeyondCompare做复杂代码合并。
12. 切换分支
右键TortoiseSVN => Switch => 选择需要切换的分支,点击确定就可以了
13. 修改仓库地址
如果您的仓库地址变了,是不是需要重新checkout一份代码呢?
快速更换:右键点击仓库根目录 => TortoiseSVN => relocate,修改仓库地址,点击确定后就修改好了
如果还有不明白的地方,你还可以查看 SVN 视频教程
Linux下SVN的使用
1. 代码检出 checkout
这个命令会把 SVN 服务器上的代码下载到我们电脑上,checkout 也可以简写为 co
svn checkout svn://svnbucket.com/xxx/xxx # 指定存储目录 svn checkout svn://svnbucket.com/xxx/xxx save-dir # 指定用户名密码。 svn checkout svn://svnbucket.com/xxx/xxx --username xxxx --password xxx |
2. 提交代码 commit
此命令可以把我们本地的修改提交到 SVN 服务器,这样其他同事就能更新到我们的代码了。
commit 可以简写为 ci,-m 参数后面跟的是本次提交的描述内容
# 描述是必须的,但是可以填写空字符串,不指定 svn commit -m "提交描述" # 只提交指定文件或目录 svn commit /path/to/file-or-dir -m "提交指定文件" # 指定后缀的所有文件 svn commit *.js -m "提交所有 js 文件" |
3. 更新代码 update
执行此命令后会把其他人提交的代码从 SVN 服务器更新到我们自己电脑上,update 也可以简写为 up
# 更新到最新 svn update # 更新到指定版本的代码。特别是最新版本代码有问题时,我们可以用这个命令回到之前的版本 svn update -r xxx # 仅更新指定文件或者目录 svn up /path/to/file-or-dir |
4. 添加文件 add
新建的文件,我们需要用 add 命令把它们加入 SVN 的版本管理,然后我们才可以提交它。
注意:添加后还需要进行提交喔。
# 添加指定文件或目录 svn add /path/to/file-or-dir # 添加当前目录下所有 PHP 文件 svn add *.PHP |
5. 删除文件 delete
此命令会从 SVN 移除版本控制,移除后你需要提交一下
svn delete /path/to/file-or-dir # 删除版本控制,但是本地依旧保留文件 svn delete /path/to/file-or-dir --keep-local |
6. 查看日志 log
# 查看当前目录的日志 svn log # 查看指定文件或目录的提交日志 svn log /path/to/file-or-dir # 查看日志,并且输出变动的文件列表 svn log -v # 限定只输出最新的 5 条日志 svn log -l 5 |
7. 查看变动 diff
# 查看当前工作区的改动 svn diff # 查看指定文件或目录的改动 svn diff /path/to/file-or-dir # 本地文件跟指定版本号比较差异 svn diff /path/to/file-or-dir -r xxx # 指定版本号比较差异 svn diff /path/to/file-or-dir -r 1:2 |
8. 撤销修改 revert
# 撤销文件的本地修改 svn revert test.PHP # 递归撤销目录中的本地修改 svn revert -R /path/to/dir |
9. 添加忽略 ignore
SVN 的忽略是通过设置目录的属性 prop 来实现的,添加后会有一个目录属性变动的修改需要提交,记得要提交一下喔,这样其他人也有了这个忽略配置。
# 忽略所有 log 文件。注意最后有个点号,表示在当前目录设置忽略属性。 svn propset svn:ignore "*.log" . # 递归忽略 global-ignores svn propset svn:global-ignores "*.log" . # 从文件读取忽略规则,一行一个规则。 svn propset svn:ignore -F filename.txt . # 打开编辑器修改忽略属性 svn propedit svn:ignore . # 查看当前目录的属性配置 svn proplist . -v # 删除当前目录的忽略设置 svn propdel svn:ignore . |
忽略仅对还未添加到版本库的文件生效,已经在版本库里的文件,添加忽略后是不会自动删除的也不会忽略,需要手动 delete 命令删除下才行。
TortoiseSVN 添加忽略会更加简单,也会自动执行删除命令。
10. 查看状态 status
任何时候,你可以用下面的命令查看当前工作目录的 SVN 状态喔,会列出来哪些文件有变动。
svn status svn status /path/to/file-or-dir #也可以简写为 svn st |
11. 清理 cleanup
这个命令我们经常在 SVN 出现报错时可以执行一下,这样就会清理掉本地的一些缓存
svn cleanup |
12. 查看信息 info
svn info |
13. 查看文件列表 ls
svn ls # 指定版本号 svn ls -r 100 |
14. 查看文件内容
# 查看指定版本的文件内容,不加版本号就是查看最新版本的 svn cat test.py -r 2 |
15. 查看 blame
显示文件的每一行最后是谁修改的(出了BUG,经常用来查这段代码是谁改的)
svn blame filename.PHP |
16. 地址重定向
如果你的 SVN 地址变了,不需要重新 checkout 代码,只需要这样重定向一下就可以了。
svn switch --relocate 原 SVN 地址 新 SVN 地址 |
17. 分支操作
# 创建分支,从主干 trunk 创建一个分支保存到 branches/online1.0 svn cp -m "描述内容" http://svnbucket.com/repos/trunk http://svnbucket.com/repos/branches/online1.0 # 合并主干上的最新代码到分支上 cd branches/online1.0 svn merge http://svnbucket.com/repos/trunk # 分支合并到主干 svn merge --reintegrate http://svnbucket.com/repos/branches/online1.0 # 切换分支 svn switch svn://svnbucket.com/test/branches/online1.0 # 删除分支 svn rm http://svnbucket.com/repos/branches/online1.0 |
18. 帮助命令
# 查看SVN帮助 svn help # 查看指定命令的帮助信息 svn help commit |
19.取消add之后的文件
svn revert ./file1.sv ; svn revert --depth=infinity ./dir1/
参考文章:
https://www.runoob.com/svn/svn-intro.html
https://svnbucket.com/posts/svn-commands-tutorial/
https://svnbucket.com/posts/svn-tutorial/
原文地址:https://www.jb51.cc/wenti/3279066.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。