0.服务器主机需要打开websharing:
sudo su (进入root,需要输入密码)
apachectl start (没有反应即打开成功)
1.建立想要保存软件仓库的目录
最好在/users/name 下创建repositary目录
cd /users/name
mkdir /svn mkdir /svn/projectname 即创建了目录 /users/name/svn/projectname
2.创建版本仓库 svnadmin create /users/name/svn/projectname
3.修改授权配置 进入到仓库配置目录 cd /users/name/svn/projectname
(1)编辑配置文件 vi svnserve.conf 取消下列行的注释 anon-access = read auth-access = read password-db = passwd (密码配置的保存文件) auth-db = authz (认证配置的保存文件)
(2)编辑密码配置文件 vi passwd
格式为 "用户名 = 密码"
(3)编辑认证文件 vi authz
格式为 :
[groups] 用户组名 = 用户组成员
[需要授权的目录] @组名 = 权限 用户名 = 权限
例如:
[groups] g_developers = jcccn,jesse,bill g_tester = jerry,wang [/] @g_developer = r jcccn = rw * = [/jcccn] @g_tester = rw jcccn = rw * = r
(4)配置忽略文件 vi ~/.subversion/config (可选步骤) 找到 global-ignores 一行,去掉注释,编辑成 global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective* 找到 enable-auto-props = yes 把注释去掉,在[auto-props] Section声明以下文本文件 *.mode* = svn:mime-type=text/X-xcode *.pbxuser = svn:mime-type=text/X-xcode *.perspective* = svn:mime-type=text/X-xcode *.pbxproj = svn:mime-type=text/X-xcode
3.启动svnserve:
svnserve -d -r /opt/svn/repos
结束服务可以用 killall -9 svnserve
4.在Xcode中配置和使用SVN (旧版xcode) (1)Xode的菜单中选择 SCM -> Configure Repositories,点击左边加号,Name填写repos的名字,SCM选择subversiion,然后填写SVN服务器的信息 Name:repos名如jcccn Scheme:svn Host:主机地址 如 192.168.1.104 Path:路径 如 / User:用户名 Password:密码
(2)然后选SCM -> Repositories ,你就可以进行创建文件夹登操作了。SVN的日常管理也可以在这里做。点击Import,选择想要进行版本控制的项目。
(3)Check out!选中项目,点击Check out,选择目标位置。相当于用svn对项目进行初始化,加入一些控制信息。这一步很重要,缺失了将不能进行版本控制
(4)打开Check out之后的项目,点击项目属性Get info,在general中将SCM Repository先选择为刚才自己的配置。
(5)设置好以后,你在你的项目视图中就可以看到新的一列,M表示该文件已经修改过,然后你已经可以通过SCM菜单,或者右键菜单直接进行SVN的操作, commit,update,revert,diff and log,任何你想要的。commit时,message最好详细填写本次版本相对于上次版本的改动
5.在smartSVN中配置和使用SVN (SVN客户端)
先普及目录树中几个小图标的意义:
什么图标都没有的代表文件已写在服务器硬盘上;
齿轮--文件第一次放入服务器缓存区后的标记(还没有写入硬盘,写入后消失);
向上箭头--需要将文件提交来写入服务器硬盘的标记(文件更改了或被创建了时出现);
绿色圆点--服务器的文件有更新的标记;
括号中的数字--更新次数;
(0)项目开始,服务器需要把服务器的本地项目导入svn库中(即上面所创建的 /users/name/svn/projectname),用import 把本地项目放到svn服务器缓存区,用add把import在缓存区(smartSVN中目录树的齿轮标识)的文件加到提交后选名单(一般项目开始需要将xcodeproj和projectname两个目录都提交),然后点commit提交写入服务器硬盘。
(1)在客户端,第一次使用需要初始化项目到客户端本地,用checkout,配置连接协议为svn,绝对路径为“/”即可,其它默认即可。(此时服务器的缓冲区就和客户端本地的项目关联了)
(2)客户端修改文件后,在目录树中的文件会呈现红色,双击能查看文件的修改变动信息,选择修改好的文件commit即可将其写入服务器硬盘(选择顶层目录能纵看所有文件情况)。(注意:修改、删除文件最好只操作自己负责的模块,如果要改动别人的模块,应该让负责的人员或leader操作,不然项目代码会陷入混乱,所以本地的绝对路径应该对不同模块创建好对应的文件夹供对应的人员方便操作)
(3)客户端添加删除文件,这个有2点需要注意,1.添加文件后应将文件add到服务器的提交后选名单;2.添加或删除文件后,xcodeproj的文件亦会被自动修改,如果不作一起commit的话,项目打开会看不到更新,但本地目录里却更新了的情况;
(4)每次commit提交前,应养成先update的习惯,确保你修改的代码文件在update后运行没问题后再commit(因为你修改的文件中所依赖的其它文件,可能在你修改开始后和准备提交前做了改动)。
(5)commit时记得写log日志信息,说明这次commit做了哪些工作或修改。
(6)新增文件后有齿轮状和红色状的DS_Store不能add和commit,红色状的UserInterfaceState.xcuserstate也一定不能commit上去,不然项目xcodeproj文件会有冲突不能打开,后果严重(而且DuanQoo.xcodeproj文件夹里的文件提交一定要单独提交,不要和m、h文件一起提交,不然也会出现冲突)。
6.命令:
1、将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
2、往版本库中添加新的文件 svn add file 例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库 svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关) 例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
4、加锁/解锁 svn lock -m “LockMessage“ [--force] PATH 例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某个版本 svn update -r m path 例如: svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。 svn update -r 200 test.php(将版本库中的文件test.php还原到版本200) svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态 1)svn status path(目录下的文件和子目录的状态,正常状态不显示) 【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】 2)svn status -v path(显示文件和子目录状态) 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。 注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件 svn delete path -m “delete test fle“ 例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file” 或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志 svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息 svn info path
例如:svn info test.php
10、比较差异 svn diff path(将修改的文件与基础版本比较) 例如:svn diff test.php svn diff -r m:n path(对版本m和版本n比较差异) 例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件 svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助 svn help
svn help ci
13、版本库下的文件和目录列表 svn list path 显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录 svn mkdir: 创建纳入版本控制下的新目录。 用法: 1、mkdir PATH… 2、mkdir URL… 创建版本控制的目录。 1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增 调度,以待下一次的提交。 2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改 svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert: 用法: revert PATH… 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
16、代码库URL变更 svn switch (sw): 更新工作副本至不同的URL。 用法: 1、switch URL [PATH] 2、switch –relocate FROM TO [PATH...] 1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将 服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的 方法。 2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动 (比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
17、解决冲突 svn resolved: 移除工作副本的目录或文件的“冲突”状态。 用法: resolved PATH… 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。 svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)
操作问题解决:
1、当import项目后提示“ ‘deratory’ is already a working copy for a different url ”时,因为提交目录下已经存在.svn的隐藏文件所致,需要把这个文件用指令删除才能恢复完全import成功,不然有部分文件不显示齿轮样的第一次导入标识。
sudo find /Users/justfly/Documents/workspace/justSVN/ -name ".svn" -exec rm -r {} ;
想要把SVN專案作轉移或複製時舊的「.svn」真的是很煩人的東西,最快的方式是用終端機輸入,指令中的意思就是搜尋在/Users/justfly/Documents/workspace/justSVN/中所有的「.svn」並用rm刪除,-r的參數是為了不要一個個去按「y」
2、当update后提示“The respository UUID doesn't match expected'”时,因为UUID是respository创建时自动生成的一个随机数,SVN Client利用UUID判断是否为同一个resp。一般遇到UUID不同时,需要重新Checkout;如果我们一定要改变UUID的话(这不正是我们想要的吗),注意,这是修改Server上resp的UUID:
svnlook uuid /var/svn/repos // 查看
svnadmin setuuid /var/svn/repos cf2b9d22-acb5-11dc-bc8c-05e83ce5dbec// 更新为
也可以直接修改work copy的UUID。本地WC的UUID写在文件.svn/entries文件中
3、在mac下设置svn的忽略文件(相对为上传者或客户端的时候),可以通过前往文件夹输入 ~/.subversion,然后将config文件用vi命令打开,将global-ignores的注释符去掉,改成global-ignores = *.o *.lo *.la *.al *.rej *~ #*# .#* .*.swp .DS_Store,可以自定义添加或删去显示文件的种类。