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

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

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


当前回答

在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子目录。

其他回答

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

我总是保持第二次签出,我称之为“trunk_clean”。每当我需要做一个与我正在做的事情相关的快速、孤立的更改时,我就在签出时提交。

我不知道只有svn有什么简单的方法。老实说,我建议使用git-svn来创建一个git repo,作为svn的工作副本,并使用git stash。只需将git pull替换为git svn rebase,将git push替换为git svn dcommit,您就可以保留90%的git工作流,并且仍然与svn服务器通信。

基于Walter的回答,我在bashrc文件中创建了以下别名:

alias svn.stash='read -p "saving local changes in raq.patch. Existing stash in raq.patch will be overwritten. Continue?[y/N]" && [[ $REPLY =~ ^[yY] ]] && rm -f raq.patch && svn diff > raq.patch && svn revert -R .'
alias svn.stash.apply='patch -p0 < raq.patch; rm -f raq.patch'

这些别名更容易使用和记忆。

用法:

svn。Stash用于保存更改,svn.stash.apply用于应用Stash。

在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子目录。