当对存储在Subversion repo中的软件进行编程时,我经常修改一些文件,然后注意到我想对我的主要工作做一些准备性更改。例如,在实现新功能时,我注意到一些重构可能会对我有所帮助。

为了不将两个不相关的更改混合在一起,在这种情况下,我想“收起”我的更改,即恢复到存储库版本,做一些其他更改,提交这些更改,然后“取回”我的更改。

Git-stash允许这样做。有没有办法在Subversion中直接或通过一些插件或脚本来做到这一点?Eclipse插件也可以。


当前回答

另一种选择是将当前签出复制到一个新目录并恢复所有更改。这样就省去了在服务器上创建临时分支的麻烦——毕竟存储是一个本地操作,不是每个人都应该看到,而且可以经常这样做。

提交修复程序后,您可以更新主工作副本并删除“存储区域”

其他回答

您可以使用svn diff将当前更改存储到补丁文件中,然后恢复您的工作副本:

svn diff > stash.patch
svn revert -R .

在你实现了你的准备功能后,你可以用补丁工具应用你的补丁:

patch < stash.patch

正如其他人所注意到的,这将不适用于svn:properties和树形操作(添加、删除、重命名文件和目录)。

二进制文件也可能会出现问题,我不知道补丁(或TortoiseSVN在这种情况下如何处理它们)。

另一种选择是将当前签出复制到一个新目录并恢复所有更改。这样就省去了在服务器上创建临时分支的麻烦——毕竟存储是一个本地操作,不是每个人都应该看到,而且可以经常这样做。

提交修复程序后,您可以更新主工作副本并删除“存储区域”

我也想要这个功能。我目前使用的是TortoiseSVN。

除了导出树,还原到存储库进行更改并提交,然后使用Beyond compare之类的工具将导出树中的更改比较回源代码控制目录之外,我还没有找到一个可靠的解决方案。

或者,另一种解决方案可能是从HEAD分支到另一个目录,进行更改并提交。一旦准备好将这些内容合并回其他工作副本,就可以进行更新并合并更改。

由于Subversion不完全支持存储特性, 我就像这样手动操作。

将开发和生产(发布)项目放在一个分开的路径上。

source\code\MyApp         -- Development
release\MyApp(release)    -- Production(release)

你可以在开发过程中为你的项目添加任何新功能, 你只会承诺有意义的进展,或者应该为稳定释放一些东西。

当你必须将它发布到生产环境,开放生产项目,更新svn并做一些事情来发布(构建,导出…)等等)。

我知道这有点麻烦,但与开发进度相比,发布进度并不经常发生(对我来说不是这样,但我知道有些项目是这样),这种方式适合我。

由于项目组成员使用svn,所以具体项目我使用svn,所以我必须遵循。 最好的解决方案是使用git,它有完善的版本控制系统,比svn更好。

上面的分支和补丁想法很棒,但对我来说并不管用。我使用一个可视化的diff工具,所以运行git diff不会产生基于文本的补丁。每次创建分支时,我们的构建系统都会旋转一个新环境,因此创建临时的“隐藏”分支会很混乱。

相反,我编写了一个小shell脚本,它将文件复制到“shelf”目录,添加时间戳,并恢复更改。它不如上面的解决方案健壮,但它也避免了我遇到的一些陷阱。