日常開發(fā)中,源代碼管理我們一般使用Git和SVN.本文主要介紹如何在iOS開發(fā)中使用SVN命令行和Xcode對源代碼進行管理,并對"垃圾"文件進行忽略.為了演示更加真實,我們需要搭建一個SVN服務器.
1. Mac環(huán)境下配置SVN服務器
Mac環(huán)境是自帶了SVN客戶端和服務器的功能,如果想配置SVN服務器,我們需要以下步驟:
1.1 創(chuàng)建代碼倉庫
- 在桌面上創(chuàng)建 /svn 文件目錄,并在svn目錄下創(chuàng)建一個SVN代碼倉庫 /code
- 在終端輸入指令
svnadmin create /Users/haoshuai/Desktop/svn/code
- 執(zhí)行成功后,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
沒有任何提示表示啟動成功
- 關閉:
打開活動監(jiān)視器來關閉:
2. SVN文件目錄的組織結構
2.1 本地代碼倉庫和遠程SVN倉庫關聯(lián)
- 在桌面上創(chuàng)建 /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 ,分別表示主干,分支,和打包版本:詳細介紹
我們打開命令行,進入本地倉庫并創(chuàng)建三個文件夾,然后提交.
cd /Users/haoshuai/Desktop/local/code
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn ci -m'創(chuàng)建目錄結構'
3.首次將代碼上傳至SVN服務器
我們創(chuàng)建好一個示例工程 myProject ,這個工程和我們實際成產環(huán)境的工程基本一致,并且是用cocoaPos來管理第三方庫的,并且已經添加了AFNetWorking這個第三方庫.
先來看一下我們項目的目錄結構:
在我們的XCode項目中,一般有一些文件是不需要上傳到服務器的,比如斷點信息,文件夾開合情況等等...如何一勞永逸忽略這些文件呢?
使用 git 時,我們有一個.gitignore文件,初始化項目時加入這個文件,不需要的信息會自動忽略.很 方便 .
但使用 SVN 的時候,就相對 麻煩 了,接下來我們一步一步來完成對SVN的文件的忽略.
- 模仿gitignore,創(chuàng)建我們自己的 .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 管理之中,這樣會導致所有的文件的狀態(tài) 都變?yōu)?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/
這里解釋一下,我們想要用svn propset svn:ignore
命令來對文件屬性進行忽略,那么這個文件所在的文件夾必須加入版本控制. 例如 myProject.xcodeproj 就是一個文件夾,里面有要忽略的文件,而且在這個文件夾里還有個 project.xcworkspace 文件夾,里面也有要忽略的文件,那我們就要依次將這些文件夾 add 進 版本控制里.
- 使用
svn propset svn:ignore -RF /Users/haoshuai/Desktop/.svnignore .
命令對文件夾里的文件進行忽略
我的 .svnignore 文件在桌面上,所以使用這個命令對工程文件里的屬性進行配置.
設置忽略屬性前后的對比
-
使用
svn add . --force
命令將其余未忽略的文件加入版本控制
可以看到,最終添加的文件都是我們想要添加的文件. 提交,輸入
svn ci -m'項目初始化上傳'
命令提交項目至遠程服務器.
經過以上的設置,我們將一些文件忽略,這樣,如果從服務器上checkout下來新的代碼后,修改代碼,提交文件時,不會將無用的文件移交上去.雖然很麻煩,但是SVN就是這樣,我暫時還沒有找到其他的方法.
4.分支管理
4.1創(chuàng)建分支
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'