当对存储在Subversion repo中的软件进行编程时,我经常修改一些文件,然后注意到我想对我的主要工作做一些准备性更改。例如,在实现新功能时,我注意到一些重构可能会对我有所帮助。
为了不将两个不相关的更改混合在一起,在这种情况下,我想“收起”我的更改,即恢复到存储库版本,做一些其他更改,提交这些更改,然后“取回”我的更改。
Git-stash允许这样做。有没有办法在Subversion中直接或通过一些插件或脚本来做到这一点?Eclipse插件也可以。
当对存储在Subversion repo中的软件进行编程时,我经常修改一些文件,然后注意到我想对我的主要工作做一些准备性更改。例如,在实现新功能时,我注意到一些重构可能会对我有所帮助。
为了不将两个不相关的更改混合在一起,在这种情况下,我想“收起”我的更改,即恢复到存储库版本,做一些其他更改,提交这些更改,然后“取回”我的更改。
Git-stash允许这样做。有没有办法在Subversion中直接或通过一些插件或脚本来做到这一点?Eclipse插件也可以。
当前回答
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。
其他回答
我不知道只有svn有什么简单的方法。老实说,我建议使用git-svn来创建一个git repo,作为svn的工作副本,并使用git stash。只需将git pull替换为git svn rebase,将git push替换为git svn dcommit,您就可以保留90%的git工作流,并且仍然与svn服务器通信。
上面的分支和补丁想法很棒,但对我来说并不管用。我使用一个可视化的diff工具,所以运行git diff不会产生基于文本的补丁。每次创建分支时,我们的构建系统都会旋转一个新环境,因此创建临时的“隐藏”分支会很混乱。
相反,我编写了一个小shell脚本,它将文件复制到“shelf”目录,添加时间戳,并恢复更改。它不如上面的解决方案健壮,但它也避免了我遇到的一些陷阱。
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。
您可以使用svn diff将当前更改存储到补丁文件中,然后恢复您的工作副本:
svn diff > stash.patch
svn revert -R .
在你实现了你的准备功能后,你可以用补丁工具应用你的补丁:
patch < stash.patch
正如其他人所注意到的,这将不适用于svn:properties和树形操作(添加、删除、重命名文件和目录)。
二进制文件也可能会出现问题,我不知道补丁(或TortoiseSVN在这种情况下如何处理它们)。
当我的工作副本中的一个任务有未提交的更改时,我需要切换到另一个任务,我会做以下两件事之一:
为第二个任务签出一个新的工作副本。 或 启动分支: workingcopy$ svn copy CURRENT_URL_OF_WORKING_COPY SOME_BRANCH workingcopy$ svn switch SOME_BRANCH Workingcopy $ SVN commit -m“正在进行的工作” workingcoyp$ svn switch WHATEVER_I_WAS_WORKING_ON_BEFORE
我有一些脚本可以帮助实现自动化。