Ubuntu下svn客户端常用命令
1. 查看版本库下文件和目录列表:
svn list path
显示path目录下的所有属于版本库的文件和目录
简称:svn ls
2. import一个工程到版本库
如将本地目录android_ori导入到版本库svn://192.168.101.47:8888/SmartPhone/
svn import -m "New import" android_ori svn://192.168.101.47:8888/SmartPhone
需要注意以上命令只是将本地android_ori目录下的文件传到svn服务器的SmartPhone目录下,不会在版本库中创建目录android_ori,如果希望创建目录如android_r1则在URL后加android_r1:
svn import -m "New import" android_ori svn://192.168.101.47:8888/SmartPhone/android_r1
svn默认上传会过滤掉一些文件,如.so, .a, .dll, .lib等,我们可以通过--no-ignore参数来改变限制上传的文件,--no-ignore表示不过滤任何文件,即支持所有的文件上传。
svn import -m "New import" --no-ignore android_ori svn://192.168.101.47:8888/SmartPhone/android_r1
3. checkout文件到本地目录
svn checkout path
如:
$ mkdir android_r1_svn
$ cd android_r1_svn
$ svn checkout svn://192.168.101.47:8888/SmartPhone/android_r1 .
简写:svn co
4. 检查文件状态或者日志
svn status [文件/目录]
svn log [文件/目录]
svn log -r6:8 [文件/目录] 查看版本6到版本8之间的日志
如:
svn status device/google
svn log device/google
5. 文件/目录比较(工作拷贝与项目创库中的比较)
svn diff [文件/目录] 或者 svn diff -r HEAD [文件/目录] -r HEAD:表示最新版本
如:
svn diff -r HEAD device/google
版本符号说明:
HEAD --------- 项目仓库中的最新版本
BASE --------- 工作拷贝的基准版本(也就是checkout出来时的版本)
COMMITTED ---- 最后一次checkin的版本
PREV --------- COMMITTED之前的一个版本
6. 更新本地工作拷贝
svn update(up) [文件/目录]
update时的一些文件标志:
U ------ 表示文件被更新
G ------ 表示项目创库中的文件和本地工作拷贝的文件合并到了一起
C ------ 表示合并时,有冲突产生
A ------ 新加入了一个文件
D ------ 删除了一个文件
? ------ 表示该文件或者目录没有被svn管理
M ------ 该文件被修改
更新到某个版本:
svn update 如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
冲突解决:
当svn update时,如果存在某个文件存在冲突,打开冲突的文件,<<<<<<<< 和 >>>>>>>> 表明了冲突发生的地方。
当冲突发生时,如果想使用项目仓库中的版本,而放弃本地拷贝的修改,可以使用以下命令:
a、svn revert [冲突的文件/目录]
如:svn revert device/google/chaba/camera.cfg
b、svn update [冲突的文件/目录]
(svn resolved [文件/目录] && svn updata [文件/目录],似乎也是ok的,需要confirm一下)
如果想保留本地工作拷贝的修改,而放弃项目仓库中版本的修改,可以如下:
a、cp 文件/目录.mine 文件/目录
b、svn resolved 文件/目录
c、svn ci -m "use my version please" 文件/目录
(在上面的三个步骤中,似乎不用做步骤a也可以达到目的)
7. svn add — 添加文件、目录或符号链。
添加文件、目录或符号链到你的工作拷贝并且预定添加到版本库。它们会在下次提交上传并添加到版本库,如果你在提交之前改变了主意,你可以使用svn revert取消预定。
8. svn delete -- 删除仓库中某个目录
svn delete -m "remote u-boot directory" svn://192.168.101.47:8888/SmartPhone/android_r1/u-boot
note: 这个命令会直接删除服务器端的目录
9. 提交工作修改
svn checkin -m "comments" [文件/目录]
简写:svn ci
如:svn checkin -m "add aere/R7629M target" device/google
其它问题:
1) checkout到本地的代码编译出现如下错误:
zip error: Invalid command arguments (cannot repeat names in zip file)
make: *** [out/target/product/damrey/system/etc/recovery-resource.dat] Error 16
make: *** Waiting for unfinished jobs....
解决
方法一:请升级SVN的版本至1.7版本,采用1.7版本的SVN,编译过程中将不会产生任何因为SVN而导致的编译错误。升级方法如下:
ubuntu中svn版本升级到1.7
1、卸载原来的svn:sudo apt-get remove subversion
2、添加1.7资源库:sudo apt-add-repository ppa:dominik-stadler/subversion-1.7
3、更新apt:sudo apt-get update
4、安装依赖的java库:sudo apt-get install libsvn-java
5、安装新版svn:sudo apt-get install subversion
6、确认安装版本:svn --version
svn升级后在原来的工作副本中使用svn updagte更新代码会有出错提示:
svn: E155036
解决:先使用svn upgrade升级本地svn版本,这个过程较慢,也可以直接删除本地目录重新checkout。
方法二:Delete all .svn files & subdirectories
由于各个image是单独生成的,所以需要在编译单个image时添加相关命令删除相应文件夹下的.svn文件
以recovery.img为例,如果需要删除recovery.img中的.svn文件,需要修改如下Code:
修改build/core/Makefile文件中的$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \依赖关系,在如下Code:
cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \
> $(TARGET_RECOVERY_ROOT_OUT)/default.prop
之后添加:
@if [ -d $(TARGET_RECOVERY_OUT) ]; then find $(TARGET_RECOVERY_OUT) -name '*.svn' | xargs rm -rf; fi
其中@if前面是一个TAB键
删除不同Image对应文件夹下的.svn文件时,这段Code添加的位置也会有所不同
各个Image的生成命令位于build/core/Makefile 中,直接到该文件中寻找生成各个Image的依赖关系,添加上述命令即可
另,删除不同Image下的.svn文件时,上述添加Code中,TARGET_RECOVERY_OUT也要做出相应修改,修改为相应文件夹路径即可