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

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

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


当前回答

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

其他回答

这篇博文建议使用diff和patch。

Git stash大约变成SVN diff > patch_name.patch;svn revert -R。 Git stash应用变成补丁-p0 < patch_name.patch

注意,这不会隐藏元数据更改或(我认为)目录创建/删除。(是的,svn与目录内容分开跟踪,不像git。)

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

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

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

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

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

Use:

svn cp --parents . ^/trash-stash/my-stash

它将从当前位置和当前修订创建一个分支,然后将工作副本中的更改提交给该分支,而不切换到该分支。

复制SRC[@REV]…DST SRC和DST都可以是工作副本(WC)路径或URL: WC -> URL:立即将WC副本提交到URL

注意,工作副本中的更改不会自动恢复(cp只是将更改复制到一个新的分支),您必须手动恢复它们。

要恢复更改,只需将新创建的分支的更改合并到工作副本。

svn merge --ignore-ancestry ^/trash-stash/my-stash -c <commited revision>

——ignore-ancestry用于不更新工作副本中的合并信息。

Use:

svn ls -v ^/trash-stash/

看看你藏东西的地方有什么。提交的修订版也被印刷。

如果你不需要了,就运行:

svn rm ^/trash-stash/my-stash

这种解决方案比使用patch更好,因为如果工作副本或当前分支的新更改与stash中的更改发生冲突,可以使用svn手段解决冲突,而patch在某些情况下会失败甚至不正确地应用patch。