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

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

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


当前回答

你可以使用Intellij IDEA - Shelve Changes轻松做到这一点

其他回答

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

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

在我的实践中,我使用git init在Subversion存储库的trunk目录中创建一个git存储库,然后添加*。git到吸盘忽略模式。

在修改了一些文件后,如果我想继续使用Subversion主线进行工作,我只需使用git stash来隐藏我的工作。在提交到Subversion存储库之后,我使用git stash pop来恢复我的修改。

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

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

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

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

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

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

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

最简单的方法是使用一个临时分支,就像这样:

$ svn copy ^/trunk ^/branches/tempbranch
$ svn switch ^/branches/tempbranch
$ svn commit -m "Stashed"
$ svn switch ^/trunk
$ ... hack away in trunk ...
$ svn commit -m "..."
$ svn merge ^/branches/tempbranch .
$ svn rm ^/branches/tempbranch
$ ... continue hacking

这可以(而且可能应该)放在一个脚本中,如果更有规律的话。

在GPL 3下有一个名为svn-stash的小Python 2脚本:https://github.com/frankcortes/svn-stash。

它的工作原理类似于前面提到的svn diff/patch解决方案,并提供了将更改作为diffs推入和弹出到某个本地目录的功能。不幸的是,存储不能被命名,只有最后一个可以被弹出(好吧,是的,它是一个堆栈,但没有这样的限制的真正原因)。但是,您总是可以将缺少的特性构建到源代码中。

它是为*ix编写的,但是在将每个“/”替换为os之后。sep它在Windows下工作得很好。

如果您使用svn 1.7或更高版本,您需要更改is_a_current_stash():删除如果“。在os.listdir(CURRENT_DIR):,因为在1.7 WC中只有一个顶级的。svn子目录。