# 工蜂 SVN shelve 介绍
社区 TortoiseSVN 的 shelve 只是本地的暂存;P4 的 shelve 是云端的暂存,可以与他人共享、协作;那工蜂 SVN 的 shelve 又是什么样的呢?
# 工蜂 SVN shelve 是什么
在软件开发过程中,经常有这些场景诉求:
1. 准入质量检查场景:当 A 同学完成编码,需要先进行 CI 代码质量检查(扫描/编译/单测/CR 等),待质量检查通过后方可提交到代码库。
2. Hotfix 场景:当前特性开发中,临时插入紧急任务(比如 hotfix),需要将当前开发中的代码暂存,待临时任务结束后,再恢复暂存的代码继续原工作。
3. 开发联调场景:当 A 同学完成编码,在提交至代码库之前,B 同学/C 同学/...需要获取 A 同学的代码进行联调,待联调通过后再提交至代码库。
社区的 SVN 对于这些场景或无法支持或支持得不好。社区 SVN 的 shelve 只是本地的暂存,无法实现与他人的共享、协作。
为了满足这些场景诉求,工蜂 SVN shelve 对标 P4 的 shelve 功能,支持将“本地修改的文件”暂存到服务器端,再将“服务器端暂存的文件”下载到本地,提供了代码在“本地开发”与“提交入库”之间的一种中间态,实现代码在入库前的共享、协作。
# 工蜂 SVN shelve 的业务流程
➢ 1、开发同学 A:
编码&保存,将变更的代码文件 shelve 到云端;然后继续其他开发任务(新特性/Hotfix)。
➢ 2.1、CI 团队/系统:
将 A 的代码文件 unshelve 到构建机,执行质量检查,将结果返回开发同学 A。
➢ 2.2、开发同学 B:
将 A 的代码文件 unshelve 到 B 的工作副本,进行联调测试。
➢ 2.3、开发同学 A:
将第 1 步中 shelve 的代码重新 unshelve 下来,进行修改质量检查问题,或修改联调问题,或继续开发刚才未完成的代码。
# 工蜂 SVN shelve 的使用方法
# 安装工蜂 TSVN 客户端
# shelve(暂存) 本地文件
# 工蜂 SVN 客户端
在本地 SVN 工作目录中修改、增加(svn add)、删除(svn delete)文件后,右键=》TortoiseSVN=》shelve;
选择需要暂存的文件,默认全选本地纳入版本控制的变更文件;
选择这些文件共同的分支根路径,比如:/trunk,/branches/dev,请务必选择正确;
输入本次 shelve 的名称和暂存说明;
【可选】对于本地变更的文件,在暂存后可以选择 revert 还是保留本地变更
# 工蜂 SVN 命令行
svn shelve ["Path1" "Path2" ...] --name "shelve的名称" --message "shelve的描述" --branch "分支根路径" [--keep-local]
--name:必填,shelve 的名称
--message:必填,shelve 的描述
--branch:必填,shelve 的文件所属分支的根路径
--keep-local:选填,使用后,则 shelve 后保留本地文件的修改;如果不使用该参数,默认 shelve 之后 revert 本地文件的修改。
Path:选填,shelve 指定的文件
# 查看 Shelve 列表
# 工蜂 SVN 客户端
在本地 SVN 工作空间,右键=》TortoiseSVN=》Shelve List;
支持按“owner”、“shelve 名称”、“文件名称”、“branch”、“message”搜索;
选中一个 shelve,将展示该 shelve 包含的文件列表;
# 工蜂 SVN 命令行
# 查看shelve列表:
svn shelve --list [--owner "svn账号"] [--limit "限制条数"] [--id-range "限制id范围"]
--list:列出 shelve 列表
--owner:选填,根据 owner 账号过滤
--limit:选填,限定返回的 shelve 条数
--id-range:选填,限定 shelve id 的范围,例如:--id-range 3:10
# 下载暂存文件 (unshelve)
# 工蜂 SVN 客户端
1. 在 Shelve List 面板,选中一个 shelve,右键=》unshelve;或者在右键“TortoiseSVN”二级菜单“unshelve”。
2. 选择 unshelve 到本地工作空间的目标分支的根路径。请注意:目标分支根路径 与 shelve 时的源分支根路径 应该是对等的层级,举例:
● 正确用法:源分支根路径:/trunk,目标分支根路径:/trunk
● 正确用法:源分支根路径:/trunk,目标分支根路径:/branches/dev
● 错误用法:源分支根路径:/trunk,目标分支根路径:/trunk/src
● 错误用法:源分支根路径:/trunk,目标分支根路径:/branches/dev/src
3. 提交 unshelve 之后,本地工作目录的处理规则:
(1)对于本地目录和 shelve 中均存在的文件,默认将 shelve 中的文件与本地文件进行 merge,当文件存在冲突时,会提示出来,并在同目录下生成冲突内容(文件名后缀加.svnpatch.rej),请参考.svnpatch.rej文件,手工编辑文件来解决冲突;
如果勾选了“Overwrite the local files with the shelved files”,则会用远端 shelve 的文件覆盖本地的文件,虽然你本地的文件可能已经更新或者修改了。
(2)如果本地工作空间不存在的目标目录&文件,则自动创建本地目录&文件。
(3)如果本地工作空间有的文件,而在 shelve 列表中是“删除”状态,当本地则将本地的文件执行 svn delete。
特例说明:当本地文件的 base ver 和 shelve 中的文件 base ver 不一样,这种情况不会直接 delete,而会认为有冲突。你可以勾选“Overwrite the local files with the shelved files”进行直接 delete。
# 工蜂 SVN 命令行
svn unshelve --id "shelve的id" --target "unshelve的目标分支" [--force]
--id:shelve 的全局 id
--target:必填,unshelve 到的目标分支
--force:选填,将会用远端 shelve 的文件覆盖本地的文件
# 更新 shelve
# 场景 1:修改 shelve 中已有文件,或往原 shelve 中添加 变更文件
# 工蜂 SVN 客户端
1. 在本地SVN工作目录中修改/增加/删除文件后,右键=》TortoiseSVN=》Shelve;
2. 选择需要暂存的文件,默认全选本地纳入版本控制的变更文件;
3. 选择待更新的 shelve id;
4. 【可选】输入 shelve 的更新说明;
5. 【可选】对于本地变更的文件,在暂存后可以选择 revert 还是保留本地变更。
# 工蜂 SVN 命令行
svn shelve ["Path1" "Path2" ...] --update --id "shelf的id" [--message "shelve的描述"][--keep-local]
--update:修改或增加 shelved 的文件,或者修改 shelve 的 owner
--id:shelve 的全局 id
--message:选填,修改 shelve 的描述
--keep-local:选填,使用后,则 shelve 后保留本地文件的修改;如果不使用该参数,则 shelve 后将 revert 本地文件的修改。
Path:更新指定的文件
# 场景 2:修改 shelve 的 owner
# 工蜂 SVN 客户端
1. 在本地 SVN 工作空间,右键=》TortoiseSVN=》Shelve List;
2. 选中一个 shelve,右键=》change owner,输入新的 owner 账号,确认即可。
# 工蜂 SVN 命令行
svn shelve --update --id "shelf的id" --props-only --owner "svn账号" [--message "shelve的描述"]
--update:修改或增加 shelved 的文件,或者修改 shelve 的 owner
--id:shelve 的全局 id
--props-only:必填,只会更新 shelve 的 owner 和 message
--owner:必填,更新后的 owner
--message:选填,修改 shelve 的描
# 场景 3:删除 shelve 中部分文件
# 工蜂 SVN 客户端
1. 在本地 SVN 工作空间,右键=》TortoiseSVN=》Shelve List;
2. 选中一个 shelve,将展示该 shelve 包含的文件列表;
3. 选中待删除文件,右键=》delete files in shelve,进行二次确认后即完成删除。
# 工蜂 SVN 命令行
svn shelve "Path1" "Path2" ... --update-rmpath --id "shelf的id"
--update-rmpath:删除 shalve 中的部分文件
--id:shelve 的全局 id
Path:shelve 中的文件路径,相对于分支根目录的文件路径
# 删除 shelve 列表
# 工蜂 SVN 客户端
1. 在 unshelve 界面,可以选择“unshelve 后删除 shelve”。
2. 在查看 shelve 的列表界面,选中 shelve,右键支持删除 shelve。
3. shelve 被删除后,shelve 列表中不再可见。
# 工蜂 SVN 命令行
svn shelve --delete --id "shelve的id"
--delete:删除 shelve
--id:shelve 的全局 id
# 工蜂 SVN shelve 的权限控制
| 用户权限 shelve 操作 | 用户对文件所属目录可读 | 用户对文件所属目录可读写 | shelve owner |
|---|---|---|---|
| 创建 shelve | Yes | Yes | |
| 查看 shelve 列表 | Yes | Yes | Yes |
| 查看文件列表 | Yes 仅对有读权限的文件可查看 | Yes 仅对有读权限的文件可查看 | Yes 仅对有读权限的文件可查看 |
| 查看文件内容 | Yes 仅对有读权限的文件可查看 | Yes 仅对有读权限的文件可查看 | Yes 仅对有读权限的文件可查看 |
| Unshelve | Yes 仅对有读权限的文件可操作 | Yes 仅对有读权限的文件可操作 | Yes 仅对有读权限的文件可操作 |
| 更新 shelve | No | No | Yes |
| 删除 shelve | No | No | Yes |
| 修改 shelve owner | No | No | Yes |