iOS开发中使用SVN的正确姿势

日常开发中,源代码管理我们一般使用Git和SVN.本文主要介绍如何在iOS开发中使用SVN命令行和Xcode对源代码进行管理,并对"垃圾"文件进行忽略.为了演示更加真实,我们需要搭建一个SVN服务器.

1. Mac环境下配置SVN服务器

Mac环境是自带了SVN客户端和服务器的功能,如果想配置SVN服务器,我们需要以下步骤:

1.1 创建代码仓库

  • 在桌面上创建 /svn 文件目录,并在svn目录下创建一个SVN代码仓库 /code
  • 在终端输入指令 svnadmin create /Users/haoshuai/Desktop/svn/code
  • 执行成功后,code 文件目录结构如下:
Snip20170703_1.png

1.2 配置SVN用户权限

主要配置 svn/code/conf 下的三个文件:

  • 打开 svnserve.conf 文件,将下列配置项前面的 #空格 都去掉.
    # anon-access = read
    # auth-access = write 
    # password-db = passwd    
    # authz-db = authz 
  • svnserve.conf 文件中 anon-access = read配置后面添加一个配置项:anon-access = none.
  • 打开 passwd 文件,在[users]下添加 账号 和 密码,例如:
[users]
codeCoder = 123
Tom = 456
  • 打开 authz 文件,配置用户组:
    [groups]
    iOS_group = codeCoder,Tom
  • authz 文件中配置权限:
[/]
@iOS_group = rw

以上的配置,添加了一个iOS_group用户组,并给这个用户组添加了两个用户,codeCoder和Tom,他们对代码仓库 /code 文件夹里的文件具有读写权限.

1.3 启动和关闭SVN服务器

  • 启动:

在终端中输入命令: svnserve -d -r /Users/haoshuai/Desktop/svn 或者 svnserve -d -r /Users/haoshuai/Desktop/svn/code
没有任何提示表示启动成功

  • 关闭:

打开活动监视器来关闭:


Snip20170703_2.png

2. SVN文件目录的组织结构

2.1 本地代码仓库和远程SVN仓库关联

  • 在桌面上创建 /local 文件夹,代表本地代码仓库.
  • 将svn上的代码仓库 checkout 至本地代码仓库 cd /Users/haoshuai/Desktop/local svn co svn://localhost/code/ --username=codeCoder --password=123

2.2 svn的目录组织结构

在代码导入到SVN之前,首先需要考虑如何组织。如果使用一种推荐的布局,以后的操作将会更容易许多。
我们一般在代码目录的顶级建3个子文件夹 /trunk/branches/tags ,分别表示主干,分支,和打包版本:详细介绍
我们打开命令行,进入本地仓库并创建三个文件夹,然后提交.

cd /Users/haoshuai/Desktop/local/code 
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn ci -m'创建目录结构'

3.首次将代码上传至SVN服务器

我们创建好一个示例工程 myProject ,这个工程和我们实际成产环境的工程基本一致,并且是用cocoaPos来管理第三方库的,并且已经添加了AFNetWorking这个第三方库.
先来看一下我们项目的目录结构:

myProject目录结构.png

在我们的XCode项目中,一般有一些文件是不需要上传到服务器的,比如断点信息,文件夹开合情况等等...如何一劳永逸忽略这些文件呢?
使用 git 时,我们有一个.gitignore文件,初始化项目时加入这个文件,不需要的信息会自动忽略.很 方便 .
但使用 SVN 的时候,就相对 麻烦 了,接下来我们一步一步来完成对SVN的文件的忽略.

  • 模仿gitignore,创建我们自己的 .svnignore 文件

SVN中,我们使用比如 svn propset svn:ignore -R -F .svnignore . 这样的命令,来对着文件夹下的所有文件进行忽略的属性设置,需要忽略的类型参数就在 .svnignore 中设置. 以下是我的.svnignore文件的内容

# Build generated
build
DerivedData

# Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata

# Other
*.moved-aside
*.xccheckout
*.xcscmblueprint

# Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

# CocoaPods
Pods

# Carthage
Carthage/Build

# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

# Code Injection
iOSInjectionProject
  • 将项目copy到 /Users/haoshuai/Desktop/local/code/trunk 文件夹中.
cd /Users/haoshuai/Desktop/local/code/trunk
svn status

显示:
? myProject
说明myProject未处于SVN管理之下,此时,我们 不能 直接运行命令 svn add myPtojcet .,这个命令是递归的将 myPtojcet 文件夹下所有文件加入SVN 管理之中,这样会导致所有的文件的状态 都变为 A (也包括我们要忽略的文件).
举个栗子:

  • 我们使用这个命令svn add -N myProject/,只将myProject这个文件夹加入SVN管理
QQ20170706-164825.png
  • 依次使用如下命令:
cd myProject/
svn add -N myProject.xcodeproj/
svn add -N myProject.xcodeproj/project.xcworkspace/
svn add -N myProject.xcworkspace/
QQ20170706-171316.png

这里解释一下,我们想要用svn propset svn:ignore命令来对文件属性进行忽略,那么这个文件所在的文件夹必须加入版本控制. 例如 myProject.xcodeproj 就是一个文件夹,里面有要忽略的文件,而且在这个文件夹里还有个 project.xcworkspace 文件夹,里面也有要忽略的文件,那我们就要依次将这些文件夹 add 进 版本控制里.

  • 使用svn propset svn:ignore -RF /Users/haoshuai/Desktop/.svnignore .命令对文件夹里的文件进行忽略

我的 .svnignore 文件在桌面上,所以使用这个命令对工程文件里的属性进行配置.

QQ20170706-172806.png

设置忽略属性前后的对比


QQ20170706-173300.png
QQ20170706-173328.png
  • 使用svn add . --force命令将其余未忽略的文件加入版本控制

    QQ20170706-173804.png

    可以看到,最终添加的文件都是我们想要添加的文件.

  • 提交,输入 svn ci -m'项目初始化上传' 命令提交项目至远程服务器.

经过以上的设置,我们将一些文件忽略,这样,如果从服务器上checkout下来新的代码后,修改代码,提交文件时,不会将无用的文件移交上去.虽然很麻烦,但是SVN就是这样,我暂时还没有找到其他的方法.

4.分支管理

4.1创建分支

svn cp svn://localhost/code/trunk/ svn://localhost/code/branches/br_feature001 -m'create branch'

cd /Users/haoshuai/Desktop/local/code/branches

svn co svn://localhost/code/branches/br_featyre001

4.2合并主干上的代码至分支

cd /Users/haoshuai/Desktop/local/code/branches/br_feature001

svn merge svn://localhost/code/trunk/

4.3合并分支上的代码至主干

cd /Users/haoshuai/Desktop/local/code/trunk

svn merge --reintegrate svn://localhost/code/branches/br_feature001

分支合并至主干后,需要删除分支.

svn rm svn://localhost/code/branches/br_feature001 -m'delete feature001'

5.打标签 tags

svn cp svn://localhost/code/trunk svn://localhost/code/tags/1.0 -m'1.0 released'

推荐阅读更多精彩内容

  • iOS 开发 SVN 版本控制器 更多技术交流请加群 iOS技术联盟 27512466 SVN是Subversio...
    Sunny_Fight阅读 8,184评论 7 63
  • 前言: 1.本文讲的是SVN版本控制工具常用功能,包括命令行和界面化操作2.如果想了解GIT使用方式,请移步这里 ...
    珍此良辰阅读 16,809评论 10 57
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 131,750评论 18 138
  • 源代码管理工具-SVN 一. 了解-源代码管理工具概述 1. 源代码管理工具的作用?> 能追踪一个项目从诞生一直到...
    Louis_hey阅读 11,039评论 1 8
  • 几乎每一个可测量的心理特质,包括智商、人格、艺术能力、数学能力、音乐能力、写作能力、幽默风格、创意舞蹈、体育、幸福...
    烈日逐风阅读 160评论 0 0
  • 下午两个半小时的艾扬格练习,练习时一身汗,最后修复体式半个小时,感觉大脑也慢慢平静下来。下背部感觉还是比较紧,但是...
    付振阅读 236评论 0 0
  • 子女若孝离时笑、勿等离时空尽孝, 愚时难尽孝、知时尽孝难。
    野孩子1982阅读 75评论 0 0