SVN代码提交指南
1、首先得到一个工作副本
使用checkout命令,格式:svn checkout [代码库路径] [本地存放路径]
eg:$svn checkout svn://android-server0/A10/AW403R1A10V11/A910 A910_commit
其中本地路径为空,将默认存放在当前目录下,且被命名为与代码库端相同的名称
checkout出来的代码是受SVN管理的,即为working copy;其每个目录下会有一个隐藏的.svn文件夹用于管理代码
注:建议checkout出来的代码只用于提交等管理操作,不要在此代码上进行编译开发,为方便区别,建议checkout出来的代码命名为projectname_commit以示此为提交之用;编译开发请在export导出的干净代码上进行。
2、导出一份干净的代码
使用export命令,格式:svn export [代码库路径] [本地存放路径]
eg: $svn checkout svn://android-server0/A10/AW403R1A10V11/A910 A910_make_0601
此命令导出的是一份不含.svn的干净代码,建议的命名为projectname_make_mmdd以区别不同时间导出的代码,使用同checkout命令
注:开发请在如上export出代的码上进行。
3、提交修改的代码
先将修改的代码( A910_make_0601)合并到工作副本(A910_commit),然后到工作副本路径下通过svn st, svn diff , svn add, svn del, svn ci等命令完成提交,具体如下:
说明一下:每次提交代码请尽量以功能为单位进行。
4、在trunks仓库里面新加一个rk3168v4.4.2date20140102
svn import --no-ignore -m" For trunks:create new trunks of rk3168"./ svn://branch/rk3168v4.4.2date20140102
5、如何生成一个.patch文件:
(1)先拉一份checkout代码;例如svn checkout svn://branch/RK3026_JB2_V1.0_AXP192_MID3_1224 checkout_3026
(2)用svn diff -rA:B >test.patch 例如:svn diff -r96:97 >97.patch 保存了一份97.patch
6、运用copy 新建一个分支:
svn copy -m"create new project." svn://branch/rk3026v4.2.2Data20131224 svn://branch/RK3026_JB2_V1.0_AXP192_MID3_1224 即可
7、svn properties 一些脚本在提交的时候会出现 这种情况 : 文件的权限不对
svn propset svn:executable on kernel/makekernel.sh 在svn中设置可执行权限,然后再提交
①、通过svn st来查看改动的文件,格式:svn st [PATH...]
若路径为空,则默认为查找并显示当前目录的所有改动,因此请不要在顶层或很大的目录上使用空的路径,那将比较耗时,通常主要有两种情况:
(1)、改动内容都在一个比较小的路径下,后面简称A情景,此时可直接到那个路径下执行svn st来进行查看确认
eg:$svn st
将看到形如如下的内容:
M rfkill/core.c
A dir1/
A dir1/file1.c
? dir2/file2.c
! dir3/file3.c
其中M代表被修改, A代表是新增, ?代表是未知, !代表被删除
(2)、改动内容分布在几个比较大的不同路径下,后面简称B情景,此时可回到包含所有这几个目录的父目录下,然后通过指明不同的分支路径来执行svn st,即:svn st path1 path2...
eg:修改分布在lichee/linux3.0/net/和android4.0/system/bluetooth/的子路径下,执行:
$svn st lichee/linux3.0/net/ android4.0/system/bluetooth/
将看到形如如下内容:
M lichee/linux3.0/net/rfkill/core.c
M android4.0/system/bluetooth/bluedroid/bluetooth.c
得到此内容也是方便我们提交时直接复制这些路径
②、通过svn diff来查看文件的内容改动,格式:svn difff [PATH...]
此操作将调用比较工具来展示文件的差异,进一步确认修改的内容,可自行指定diff工具以方便进行相应修改合并等(如meld工具,此适合在图形界面下进行,若有发现终端上行之有效的方法,请告知大家并更新文档)
eg:A情景 请直接在那个路径下执行:
$svn diff
B情景 请在能包含所有要查看改动的父目录下执行:
$svn dif lichee/linux3.0/net/rfkill/core.c android4.0/system/bluetooth/bluedroid/bluetooth.c
当然亦可选择查看你需要查看的内容:
$svn dif lichee/linux3.0/net/rfkill/core.c
③、通过svn add及svndel来进行文件的增减操作,格式:svn add/del [PATH...]
若有文件的增减,需使用此命令来进行,此只是在本地操作,需在svn ci后才真正到版本库
eg:在上面svn st看到的带问号'?'和感叹号'!'的文件还不能被提交,需先用svn add或svn del改变到已知的A或D状态后,方可被提交:
$svn add dir2/file2.c
$svn del dir3/file3.c
④、通过svn ci来提交修改,格式:svn ci -m"log message" [PATH...]
此操作才是真正完成将代码提交至服务器的工作,同以上的命令,svn ci后的路径若为空,则将提交当前目录下的所有修改,即A情景,此操作也最为常用。当然此时也可只提交指定的文件
当一次提交的内容分布在几个比较大的不同路径下时,即B情景,需在svn ci后指出具体被提交的内容,此内容便是通过svn st -m"log message" path1 path2这样的命令来获取的
eg:A情景 直接在那个路径下执行:
$svn ci -m"log message"
将自动提交其路径下的所有改动
B情景 在能包含所有要提交的改动的父目录下执行:
$svn ci -m"log message" lichee/linux3.0/net/rfkill/core.c android4.0/system/bluetooth/bluedroid/bluetooth.c
注:提交代码时必须填写日志信息(log message)来描述本次提交的内容,请使用英文,尽量详细易懂
4、工作副本的更新
使用svn up命令,格式:svn up [PATH...]
同样,若所跟路径为空,则更新当前目录下的内容,亦可更新指定路径的内容
5、冲突的解决
冲突的产生主要发生在多人同时修改某个文件,且改动到相同的行或段落时,svn提交无法自动判别到底是应该使用谁的修改,而使用的一种交互方式由人工来选择解决这个问题,即解决冲突。
在我们这样的开发中一般是很难遇到冲突的,所以此处不对其进行详细描述
6、综上,svn客户端常用的几条命令:
svn checkout:检出工作副本
svn export:导出干净的代码
svn up:更新本地工作副本的状态
svn st:svn status的简写,查看详细的修改状态
svn diff:比较指定内容的差异,可定制比较工具
svn add:增加目录
svn del:svn delete的简写,删除目录
svn ci:svn commit的简写,提交修改
注意体会svn st与svn diff、svn ci后跟所跟[PATH...]的不同意义,及各命令的用处
?常用到查看库信息的命令:
svn log:查看提交日志
svn info:查看工作副本的相关信息
另外可能用到的命令:svn rename、svn rm、svn revert、svn resolved、svn merge等
更多命令和功能请自行查阅相关文档及help功能
7、版本库的管理方式:
①、一个平台单独创建一个版本库,如A10、A13、MT6575等
②、版本库的管理架构为branches、tags、trunks方式
trunks下存放我们从外界拿到的每一份原始代码,在branches下从trunks的相应代码上拉取分支作为具体项目的开发使用,必要的时候会创建相应tag到tags下,当然后续由于项目的相近度,会直接在某个branch上再创建分支,或创建新的分支然后进行合并
③、版本库中trunks下的所有源码是并列的,命名举例:AW404R11A13V14RC3
其中AW404R11为代码的基础版本信息:AW代表allwinner,404R11代表是android-4.04_r1.1,A13V14RC3为全志开发后的具体版本信息:A13代表平台,V14代表主版本,RC3代表子版本,后续全志的主干代码命名均会采用此方式
由于我们拿到的源码经常是其他方案公司再全志发放的代码上再次开发过后的,此时可再附加相应字段指定代码来源,如:AW404R11A13V14RC3_xingwu
注:当我们拿到一份源码进行导入时,命名信息一定要准确详细,包名描述可能不详细,需通过源码的BUILD_ID来查找对应的基础android版本,如IMM76D对应android-4.0.4_r1.1,具体可参考http://source.android.com/source/build-numbers.html
④、每一个trunks里的代码可能创建出很多项目分支,但显然这些分支都具有共同的基础源码,因此在branchs下会对分支进行分类管理,分类名及为trunks下的代码名称,我们的开发都是在branchs下进行的,因此对开发者而言,代码的路径举例:
svn://192.168.1.123/A13/branches/AW404R11A13V14RC3/713A1 # 指定具体ip
svn://android-server0/A13/branches/AW404R11A13V14RC3/713A1 # 通过主机名
file:///home/svnadmin/svnsources/A13/branches/AW404R11A13V14RC3/713A1 # 服务器本地
大家也可不理会,每一个项目的具体路径到时会通知相应的开发人员
8、扩展:
1、svn的版本号是针对整个版本库(通过svn create path创建)的,所以你看到的某个分支下的版本并不一定是连续递增的,每一个版本都是对整个版本库的一个快照
2、代码库中的几乎任何改动都是受svn版本化管理的对象,如目录的增加和属性的修改等
3、svn的忽略特性,即svn可以在相关操作中忽略掉某些文件,如import、add、status等操作中,缺省会忽略掉*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store这些文件,用户可自行修改这些忽略列表和忽略属性,当然可指定--no-ignore参数来强制不执行忽略规则