因为项目使用了Jenkins构建,要将构建结果通过svn上传到指定仓库。
所以就必须使用命令行操作svn
检出仓库
svn checkout repo_url desk_path # 检出到指定的磁盘目录 svn checkout repo_url ./ # 检出到当前工作目录 复制代码
查看仓库信息
svn info 复制代码
添加文件到版本控制
svn add file_fullpath # 完整的磁盘目录 svn add file_relative_path # 相对于工作目录 svn add file1 file2 file3 ... # 添加多个文件 复制代码
如果重复添加会提示
Uncaught Error Error: Command failed with exit code 1: svn add version.json svn: warning: W150002: 'version.json' is already under version contr 复制代码
这时候就需要检查下文件的状态svn st file
,返回值如下:
- 空字符串表示和服务器完全同步
- ?开头表示未在版本控制
- A开头表示本地已经添加到版本控制中,但是还没有提交
- M开头表示本地发生了修改
添加文件到版本控制之前,先根据文件状态,再决定是否添加
提交文件
svn commit file1 file2 file3 -m "log" # log测试发现不支持空格 复制代码
如果文件没有发生变化,也是可以提交的,svn会自动过滤掉无须提交的文件
file1必须是本地文件,也就是svn的工作目录必须是一个有效的仓库
svn commit -m "将1.json提交到远程仓库" ./1.json http://192.168.1.39:8080/svn/1.json svn: E205000: Try 'svn help commit' for more information svn: E205000: Commit targets must be local paths svn: E205000: 'http://192.168.1.39:8080/svn/1.json' is not a local path 复制代码
提交文件到指定目录
如果要导入指定文件到指定的SVN目录 可以使用import指令
svn import [PATH] URL svn import -m "import_file" ./1.json svn_repo/1.json # 文件对文件 svn import -m "import_dir" ./dir svn_repo/dir # 目录对目录 复制代码
- 如果
PATH
是文件,会在仓库中创建相同的文件 - 如果
PATH
是目录,会将目录中的所有内容提交到URL
如果版本库中存在该文件,再次import会触发错误E160020
导出
usage: 1. export [-r REV] URL[@PEGREV] [PATH] 2. export [-r REV] PATH1[@PEGREV] [PATH2] 复制代码
- 从
URL
指定的仓库中导出一个干净的目录树到PATH
,默认导出到HEAD版本,也可以手动指定导出REV
版本。如果省略PATH
,本地目录名为URL的最后一段目录。 - 将
PATH1
的REV
版本导出到PATH2
中,如果不指明REV
,则会使用PATH1
的本地最高版本。 如果省略了PATH2
,本地目录名会使用PATH1
的最后一级目录。 如果不指明REV
,本地所有的修改将会保留。 不在版本控制的文件不会复制。
如果指定,PEGREV将确定目标首先在哪个修订中 抬起头来。
SVN错误码
错误码 | 原因 |
205007 | 提交代码的时候缺少日志,加上-m 参数即可 |
E160020 | 文件已经存在仓库, |
svn: E155036: The working copy at is too old
2018 VisualSVN 3.8
.svn/format |
svn version |
7 | svn1.3 |
8 | svn1.4 |
9 | svn1.5 |
从1.6开始使用entries | |
.svn/entries |
svn version |
--- | --- |
10 | svn1.6 |
12 | svn1.7 |
svn: E155036: Please see the 'svn upgrade' command svn: E155036: The working copy at ''is too old (format 8) to work with client version '1.13.0 (r1867053)' (expects format 31). You need to upgrade the working copy first. 复制代码
Jenkins subversion使用的format是8,是一个很老的版本,
发现每个目录下都有.svn
文件,这个目录结构是svn1.6及其以下版本检出时的结构。
很明显,Jenkins内置的svn版本低于1.6,而system安装的svn版本是1.13
,使用1.6
checkout,再使用1.13
操作svn,就会出现这个问题。
去插件管理里面,查看Subversion插件和当前的Jenkins无法匹配
没办法,Jenkins不敢动,暂时就这样吧,手动svn upgrade`下就行了
subversion的参数
Repository depth : 检出和更新命令的深度选项。默认值为无穷大infinity。
- empty: 仅包括操作的直接目标,而不包括其任何文件或目录子级。
- files: 包括操作的直接目标及其任何直接文件子级。
- immediates: 包括操作的直接目标及其任何直接文件或目录子级。目录子级本身将为空。
- infinity: 包括直接目标、它的文件和目录子级、它的子级等等,直到完全递归。
- as-it-is: 从当前工作副本中获取工作深度,所以允许使用--set depth选项手动设置更新深度。
Check-out Strategy: 检出策略
Use 'svn update' as much as possible:
尽可能使用“svn update”,使构建速度更快。但这会导致在新的构建开始时,来自先前构建的工件仍然保留。
Always check out a fresh copy
首先删除所有内容,然后执行“svn checkout”。虽然这需要时间来执行,但它可以确保工作区处于原始状态。
Do not touch working copy, it is updated by other script
此选项允许使用本机svn客户端来更新工作副本,以避免javasvn客户端速度慢。使用“pre-scm buildstep”插件更新工作副本。
Emulate clean checkout by first deleting unversioned/ignored files, then 'svn update'
Jenkins将首先删除所有未版本化/修改的文件/目录,以及“svn:ignore”忽略的文件/文件夹,然后执行“svn update”。这模拟了新的检出行为,而无需完全检出。
Use 'svn update' as much as possible, with 'svn revert' before update
在执行“svn更新”之前,请执行“svn-revert”。这会稍微减慢构建速度,但这会防止文件被构建修改。
总结
想要将文件提交到其他仓库,最灵活的做法:
- 新建一个目录
- 把目标仓库检出到目录
- 执行update更新仓库
- 把修改的文件copy到目录
- 执行svn add操作
- 执行svn commit 操作