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

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

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


当前回答

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

$ 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

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

其他回答

我想对上面提到的所有解决方案做一个总结,因为在这个问题下很混乱。一些高投票的答案是模棱两可的,我花了很多时间来证明答案的某些部分是真的还是假的。

解决方案:

签出一个新的工作副本并在新的副本中工作。(最简单最安全的方法) 创建分支→切换到新分支→blablabla(有人说这会在SVN服务器中产生一些垃圾) 创建补丁→还原工作副本→补丁返回(如果你没有任何未添加的文件或已删除的文件,则非常有用) 使用搁架(见下文)

我试了第1、2和3条。

第一条是最简单、最安全的。如果你想节省时间,可以使用这个解决方案。我知道这并不优雅。

#3不是我的选择,因为你可以用未添加的文件和现有文件的更改创建一个补丁。但它不会在创建补丁后删除那些未添加的文件。那么该怎么办呢?我必须创建一个补丁(选择未添加的文件)→恢复工作副本→手动删除所有未添加的文件。这一点都不像git -u那样。

# 4。Shelve将是git stash -u最优雅、最相似的一种方式。添加未添加/未跟踪的文件→搁置→完成。看到了吗?与git stash -u相比,唯一的区别是你必须先添加未添加的文件,然后搁置。


测试环境:

我正在测试所有使用Windows Tortoise SVN客户端使用网络共享副本(SAMBA)和Windows Tortoise SVN客户端创建的本地回购。

因此,如果您使用的是不同于本地共享的SVN服务器,我不知道情况会有什么不同。但我想架子在任何情况下都可以工作,因为它是本地操作。

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

svn diff > stash.patch
svn revert -R .

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

patch < stash.patch

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

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

基于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。

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。

当我的工作副本中的一个任务有未提交的更改时,我需要切换到另一个任务,我会做以下两件事之一:

为第二个任务签出一个新的工作副本。 或 启动分支: 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

我有一些脚本可以帮助实现自动化。