暂时放弃Subversion(la-git-stash)中未提交的更改
在编写存储在Subversion仓库中的软件时,我经常修改一些文件,然后注意到我想对我的主要工作做一些准备性的改变。 例如,当实现新的function时,我注意到一些可能帮助我的重构。
为了不混合两个不相关的变化,在这种情况下,我想“collections”我的变化,即恢复到版本库,做一些其他的更改,提交这些,然后“取回”我的变化。
git-stash允许做到这一点。 有什么方法可以直接使用Subversion或者使用一些插件或脚本来实现。 Eclipse插件也可以。
当我从我的工作副本中的一个任务得到未提交的更改并且需要切换到另一个任务时,我执行以下两项操作之一:
检出第二个任务的新工作副本。
要么
开始一个分支:
workingcopy$ svn copy CURRENT_URL_OF_WORKING_COPY SOME_BRANCH workingcopy$ svn switch SOME_BRANCH workingcopy$ svn commit -m "work in progress" workingcoyp$ svn switch WHATEVER_I_WAS_WORKING_ON_BEFORE
我有一些脚本可以帮助自动化。
这个博客文章build议使用diff和补丁。
-
git stash
大约成为svn diff > patch_name.patch; svn revert -R .
svn diff > patch_name.patch; svn revert -R .
-
git stash apply
会变成patch -p0 < patch_name.patch
请注意,这不会存储元数据更改或(我认为)目录创build/删除。 (是的,svn跟目录内容分开跟踪,不像git。)
你可以用svn diff
将当前的修改保存到补丁文件中,然后恢复你的工作副本:
svn diff > stash.patch svn revert -R .
在实现准备function之后,可以使用修补程序实用程序应用您的修补程序:
patch < stash.patch
正如其他人已经注意到,这不会与svn:properties
和树操作(添加,删除,重命名文件和目录)。
二进制文件也可能给出问题,我不知道如何补丁(或在这种情况下处理它们的TortoiseSVN)。
最简单的方法是使用临时分支,如下所示:
$ 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
这可以(也可能应该)放在脚本中,如果更经常的话。
我不知道用svn做一个简单的方法。 老实说,我build议使用git-svn
来作为一个svn工作副本的git回购,并使用git stash
。 只要用git svn rebase
replacegit pull
,用git svn dcommit
git push
即可,实际上你可以保留90%的git工作stream,仍然可以和svn服务器通信。
在GPL 3下有一个叫做svn-stash
的小Python 2脚本: https : //github.com/frankcortes/svn-stash 。
它的工作方式与上面提到的svn diff/patch
解决scheme相似,并提供推送和popup变化作为差异到一些本地目录。 不幸的是,这些藏着不能命名,只有最后一个可以被popup(嗯,是的,这是一个堆栈,但没有真正的理由这样的限制)。但是,然后,你总是可以build立缺失的function到资源。
它是为* ix编写的,但是在用os.sep
replace每个“/”之后,它在Windows下工作的很好。
如果使用svn 1.7或更高版本,则需要更改is_a_current_stash()
: if ".svn" in os.listdir(CURRENT_DIR):
删除该行,因为在1.7 WC中只有一个顶级.svn子目录。
另一种select是将您当前的结帐复制到新的目录并还原所有更改。 这样你就可以省去在你的服务器上创build一个临时分支的麻烦了 – 所有的存储都是本地操作,这不是每个人都应该看到的,而且可以经常进行。
提交修补程序后,您可以更新您的主要工作副本并删除您的“存储区域”
您可以使用Intellij IDEA – Shelve变更轻松完成
我也想要这个function。 我目前使用TortoiseSVN。
除了导出树之外,我还没有find一个坚硬的解决scheme,恢复到存储库中进行更改并提交,然后使用“Beyond Compare”之类的工具将导出树中的更改与我的源代码pipe理的目录进行比较。
或者,另一个解决scheme可能是从HEAD分支到另一个目录,进行更改和提交。 一旦准备好将这些文件合并到其他工作副本中,请执行更新并合并您的更改。
我总是保持第二个结账,我称之为“trunk_clean”。 每当我需要做一个与我正在做的事情有关的快速,孤立的变化时,我只是在结账时承诺。
上面的分支和修补的想法是伟大的,但他们不适合我。 我使用一个可视化差异工具,所以运行git diff
不会产生基于文本的补丁。 我们的构build系统每创build一个分支时都会创build一个新的环境,因此创build临时“存储”分支将变得杂乱无章。
相反,我写了一个shell脚本 ,将文件复制到“shelf”目录,添加一个时间戳,然后恢复更改。 它不像上面的解决scheme那样健壮,但也避免了我碰到的一些陷阱。
在我的实践中,我使用git init
在svn repository的trunk
目录中创build一个git仓库,然后将*.git
添加到svn忽略模式中。 在修改了一些文件之后,如果我想继续使用svn mainline工作,我只是使用git stash
来存储我的工作。 在提交svn仓库之后,我使用git stash pop
来恢复我的修改。