在TortoiseSVN中如何搁置?

59

我已经从TFS转移到了SVN(TortoiseSVN),但很想念TFS的“Shelve”功能。我阅读了各种关于如何在SVN中“Shelve”的文章,但没有找到一种非常简单易懂的方法。

理想情况下,我希望在TortoiseSVN上下文菜单中添加“Shelve”和“Unshelve”选项。“Shelve”会移除当前的shelve集,并将工作目录上传到由用户选项定义的合适路径下。“Unshelve”会将该集与工作副本合并。

是否存在这样的功能?有人能建议一些在GUI中“hack”该功能的方法吗?

注:以下链接无法实现我要求的用户体验:

Shelving Subversion

TFS Shelve最棒的一点就是它的易用性...

8个回答

32

我不相信SVN的服务器产品内置了这个功能。我也没有在我使用的任何客户端(包括TortoiseSVN)中发现类似模拟的功能。

为了解决这个问题,我已经选择使用像GitMercurial这样的分布式版本控制系统,在将内容推回SVN之前,允许我在本地进行分支/合并/搁置。虽然这可能有点笨拙,但它确实非常有效。


3
我不认为这是一个临时方案。我在与团队合作时多年来一直使用单独的个人版本控制系统,尤其是在使用基于锁定的版本控制系统(如SourceSafe)时,我们需要对提交进行严格控制。 - Andy Dent
3
没错,这并不是一个权宜之计。老实说,我不知道为什么我会这么说,可能是为了避免被责备而加上的免责声明 :) 我非常喜欢在推送到标准集中式版本控制系统之前,使用分布式版本控制系统来进行本地暂存。 - OJ.
3
参见:如何同时使用Mercurial和SVN https://dev59.com/Jm445IYBdhLWcg3w_O8m - AndyM
4
SVN的Patch功能与下面某些答案中所指的期望行为基本相符。 - achekh
2
但是你如何用这种方式与其他开发人员共享代码? shelv-sets 的一个优点是,我的同事可以将代码放在我可以访问的地方进行代码审查,然后再提交。 - Mosh
显示剩余2条评论

21

SVN的存储功能在版本1.10中开始推出,详情请查看发布说明


丢失本地更改以更新到最新版本是浪费时间的。我不知道 Git 是否也是同样的方式工作。在这种情况下,TFS 是最好的选择。 - Shaiju T

16
如果你了解SVN分支的工作原理,那么在SVN中模拟书架就很简单:
  1. 在仓库中创建一个分支(在服务器上)
  2. 将本地副本切换到该分支
  3. 提交更改到新的分支
  4. 将本地副本切换回主干
当你准备恢复被搁置的更改时,只需将书架分支合并回本地副本即可。
如果你不熟悉命令行SVN或Tortoise SVN,无法完成上述操作,请参考以下超详细的逐步说明:
  1. 执行“SVN更新”以将工作副本更新为主干的最新版本。这样本地副本和主干之间的唯一差异就是你所做的更改。
  2. 从上下文菜单中选择“分支/标记”
  3. 默认情况下选择“仓库中的HEAD版本”选项。保持不变。
  4. 更改“To Url”以指定分支名称,例如 http://server/repository/project1/branches/shelf1
  5. 选中“切换工作副本到新的分支/标记”框
  6. 单击确定以创建分支并切换到该分支
  7. 执行“SVN提交...”并将更改提交到新创建的分支
  8. 从上下文菜单中选择“切换...”
  9. 更改“To URL”为主干URL,例如http://server/repository/project1/trunk
  10. 单击确定以切换回主干
点击此链接以获取更多详细信息和上述命令行等效项:
Subversion中的书架

12
在大型代码库中,这个过程非常慢且容易出错(如果有文件被删除或移动的话就更麻烦了)。 - Samaursa
1
@Samaursa,哪一步骤比较慢?此外,删除对我来说从未是问题,除非工作副本中存在未版本化的项目(在切换之前应该清理,阅读此文:http://subversion.apache.org/faq.html#switch-problems)。 - Andriy Volkov
在我工作的代码库(它相当大)甚至是一些逐渐变得复杂的项目上,切换到一个新分支甚至主干都非常非常慢。为了个人项目,我转向了Mercurial。还有未版本化的问题。一旦转向Mercurial,我简直不敢相信一切变得如此容易。太遗憾他们在工作中没有使用它。如果SVN有一个存储选项就好了。 - Samaursa
8
在我看来,所有这些切换似乎都是一种权宜之计。SVN 似乎开始落后了,而许多版本控制工具(例如 Perforce、TFS、Mercurial(通过扩展))都具备此功能,可以轻松地将临时代码保存在服务器上并轻松恢复等等。 - Jason

11

我在想这是TortoiseSVN的特性还是Subversion的特性?我找不到svn中有关shelving的任何提及。 - Sergеу Isupov
2
这是一个新的Subversion功能,请参见https://subversion.apache.org/docs/release-notes/1.10#shelving。 - TWT
2
TortoiseSVN 1.10还增加了这个功能 https://tortoisesvn.net/tsvn_1.10_releasenotes.html - Muhammad Naderi

9
另一个选择是使用TortoiseSvn中的“创建补丁”功能来创建补丁文件并还原更改。稍后可以重新应用补丁文件以恢复到之前的状态。 但是,如果必须更新工作副本版本,则仍可能出现一些棘手的合并问题。

3

这将是答案,当它不再是实验性的时候,感谢tartarismo。这是一个方便的链接:https://cwiki.apache.org/confluence/display/SVN/Shelving+and+Checkpointing+Dev - JacquesLeRoux

1

你可以使用分布式版本控制系统(DVCS),但这只是一种权宜之计。在 DVCS 中,“搁置”操作仅将更改存储在本地。如果您想要保存工作内容,最好将其保存在服务器上,而不仅仅是用于检查点以便在进一步工作中出现问题时回滚。

在 SVN 中,可以通过将工作副本切换到不同的 SVN 位置并在那里提交来实现此目的,而无需显式执行“搁置”命令。这实际上类似于创建一个临时分支,并在整个工作期间在该分支上工作。我认为您甚至不需要合并,因为 SVN 将在切换时自动为您执行合并,因为您的本地修改将被保留。

不幸的是,您无法切换到不存在的位置,因此第一次执行此操作时,您必须创建要搁置的“分支”。我猜整个过程可以自动化。


0

支持功能

SVN对货架的支持是实验性的,这意味着它不保证向后兼容未来的版本,也默认情况下禁用。

它从版本1.10开始启动

但是使用1.10和1.11创建的货架不受新版本支持,因为它没有承诺支持。

因此,有不同的基础,您必须注意这是一个实验性功能,并将随时间改进。

1.10货架命令以svn shelve开头,而1.11和1.12以svn x-shelve开头。

命令

新货架的命令如下:

    svn x-shelf-diff
    svn x-shelf-drop
    svn x-shelf-list, x-shelves
    svn x-shelf-list-by-paths
    svn x-shelf-log
    svn x-shelf-save
    svn x-shelve
    svn x-unshelve

激活

要使用此功能进行激活,您必须通过设置环境变量来运行命令:

#Shelving-v3, as introduced in 1.12
SVN_EXPERIMENTAL_COMMANDS=shelf3
#Shelving-v2, as introduced in 1.11
SVN_EXPERIMENTAL_COMMANDS=shelf2

更多信息可以在这里找到:

https://subversion.apache.org/docs/release-notes/1.14.html#shelving


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接