日常开发中,源代码管理我们一般使用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 文件目录结构如下:
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这个第三方库.
先来看一下我们项目的目录结构:
在我们的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管理
- 依次使用如下命令:
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-173300.png QQ20170706-173328.png
-
使用
QQ20170706-173804.pngsvn add . --force
命令将其余未忽略的文件加入版本控制
可以看到,最终添加的文件都是我们想要添加的文件. -
提交,输入
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'
网友评论