# 工蜂 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 客户端

工蜂 TSN 安装指南请戳这里

# shelve(暂存) 本地文件

# 工蜂 SVN 客户端

  1. 在本地 SVN 工作目录中修改、增加(svn add)、删除(svn delete)文件后,右键=》TortoiseSVN=》shelve;

  2. 选择需要暂存的文件,默认全选本地纳入版本控制的变更文件;

  3. 选择这些文件共同的分支根路径,比如:/trunk,/branches/dev,请务必选择正确;

  4. 输入本次 shelve 的名称和暂存说明;

  5. 【可选】对于本地变更的文件,在暂存后可以选择 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 客户端

  1. 在本地 SVN 工作空间,右键=》TortoiseSVN=》Shelve List;

  2. 支持按“owner”、“shelve 名称”、“文件名称”、“branch”、“message”搜索;

  3. 选中一个 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
lastUpdate: 3/11/2025, 11:08:41 AM