Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn 暂时搁置Subversion中未提交的更改(一个“git隐藏”)_Svn_Versioning - Fatal编程技术网

Svn 暂时搁置Subversion中未提交的更改(一个“git隐藏”)

Svn 暂时搁置Subversion中未提交的更改(一个“git隐藏”),svn,versioning,Svn,Versioning,在编写Subversion repo中存储的软件时,我经常修改一些文件,然后注意到我想为我的主要工作做一些准备性的更改。例如,在实现新功能时,我注意到一些重构可能对我有所帮助 为了避免混淆两个不相关的更改,在这些情况下,我希望将更改隐藏起来,即恢复到存储库版本,执行一些其他更改,提交这些更改,然后取回更改 允许这样做。使用Subversion是否有办法做到这一点,可以直接使用,也可以使用一些插件或脚本。Eclipse插件也很好。我也想要这个功能。我现在用的是乌龟 除了导出树、恢复到存储库、进行更

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

为了避免混淆两个不相关的更改,在这些情况下,我希望将更改隐藏起来,即恢复到存储库版本,执行一些其他更改,提交这些更改,然后取回更改


允许这样做。使用Subversion是否有办法做到这一点,可以直接使用,也可以使用一些插件或脚本。Eclipse插件也很好。

我也想要这个功能。我现在用的是乌龟

除了导出树、恢复到存储库、进行更改并提交,然后使用Beyond compare之类的工具将导出树中的更改比较回源代码管理目录之外,我还没有找到一个硬性解决方案


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

最简单的方法是使用临时分支,如下所示:

$ 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

如果定期执行,这可以也可能应该放在脚本中。

当我的工作副本中的一个任务有未提交的更改,并且我需要切换到另一个任务时,我会执行以下两种操作之一:

签出第二个任务的新工作副本

开设分行:

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

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

您可以使用svn diff将当前更改存储到修补程序文件中,然后还原您的工作副本:

svn diff > stash.patch
svn revert -R .
在实现准备功能后,您可以使用修补程序实用程序应用修补程序:

patch < stash.patch
正如其他人所指出的,这将不适用于svn:properties和树操作添加、删除、重命名文件和目录


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

另一种选择是将当前签出复制到新目录,并还原所有更改。通过这种方式,您将省去在服务器上创建临时分支的麻烦,因为所有的隐藏都是本地操作,不是每个人都应该看到并且可以经常执行


提交修补程序后,您可以更新主工作副本并删除“存储区域”

我不知道有什么简单的方法可以只使用svn来实现这一点。老实说,我建议使用git svn制作一个git回购,作为svn的工作副本,并且只使用git隐藏它。只要用git svn rebase替换git pull,用git svn dcommit替换git push,就可以保留90%的git工作流程,并且仍然可以与svn服务器通信。

建议使用diff和patch

git stash大约变成svn diff>patch\u name.patch;svn-R。 git stash apply变为patch-p0请注意,这不会隐藏元数据更改,也不会创建/删除目录。是的,与git不同,svn独立于目录内容跟踪这些内容。

在GPL3下有一个名为svn stash的小型Python 2脚本:

它的工作原理与前面提到的svn diff/patch解决方案类似,并提供了将更改作为diff推送到某个本地目录的功能。不幸的是,这些藏品无法命名,只能弹出最后一个。是的,这是一个堆栈,但没有真正的理由限制。但是,您可以将缺少的特性构建到源代码中

它是为*ix编写的,但是在用os.sep替换了every/之后,它在Windows下也能很好地工作


如果使用svn 1.7或更高版本,则需要更改is__current_stash:删除os.listdirecurrent_DIR:中的If.svn行,因为在1.7 WC中只有一个顶级.svn子目录。

我始终保留第二个签出,我称之为trunk\u clean。每当我需要做一个与我正在做的事情相关的快速、独立的更改时,我只需在签出时进行承诺。

上面的分支和修补思想非常好,但它们对我来说不太合适。我使用visualdiff工具,所以运行gitdiff不会生成基于文本的补丁。我们的构建系统在每次创建分支时都会启动一个新环境,因此创建临时隐藏分支会变得很混乱


相反,我编写了一个脚本,将文件复制到工具架目录,添加时间戳,并恢复更改。它不像上面的解决方案那样健壮,但它也避免了我遇到的一些陷阱。

使用Intellij IDEA可以很容易地做到这一点-

在我的实践中,我使用git init在Subversion存储库的主干目录中创建git存储库,然后将*.git添加到Suctions ignore模式中

在修改了一些文件之后,如果我想继续使用Subversion主线,我只需要使用git stash来隐藏我的工作。委员会之后
在Subversion存储库中,我使用git stash pop恢复修改。

根据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用于应用隐藏

从2018年4月13日1.10.0起,您已经完成了实验。它只不过是保存修补程序并应用回的助手,因此它与svn diff+修补程序具有相同的限制,即无法处理二进制文件和重命名。编辑:

编辑^2:随着2018-10-30发布的1.11.0,二进制文件被删除。仍不支持搁置重命名的文件。1.11中的搁板与1.10中创建的搁板不兼容

编辑^3:随着2019-04-24发布的1.12.0,复制和重命名将被禁用。1.12中的搁置与早期版本创建的搁置不兼容

编辑^4:使用和对搁置没有任何更改。命令仍标记为实验命令,您需要定义SVN_experional_Commands=shelf3以启用该功能。这项功能看起来很有用

设计说明可在“开发者”网站上找到

$svn x-shelve-帮助 x-shelve:将本地更改移动到工具架上。 用法:x-shelve[-保留本地]SHELF[路径…] 将给定路径中的本地更改保存到新的或现有的工具架。 从WC恢复这些更改,除非给出“-保持本地”。 可以使用-m、-F等设置工具架的日志消息。 “svn搁置-保留本地”与“svn搁置保存”相同。 您可以搁置的更改类型包括可提交的文件更改和 属性,但以下类型尚不受支持: *复制和移动 *mkdir和rmdir 无法提交冲突、未版本和缺失等状态 被搁置。 要恢复搁置的更改,请使用“svn unshelve SHELF”。 搁板当前存储在/.svn/experimental/sheels/下。 在Subversion 1.10中,工具架存储在/.svn/sheels/as下 补丁文件。要恢复由1.10创建的工具架,请使用1.10 客户端查找并取消搁置它,或查找修补程序文件并使用任何 1.10或更高版本的“svn补丁”来应用它。 搁置特性是实验性的。此命令可能会更改 在下一个版本中,没有向后兼容的承诺。 有效选项: -q[-quiet]:不打印任何内容,或仅打印摘要信息 -试运行:尝试运行,但不做任何更改 -保持本地:在工作副本中保持路径 ... $svn x-取消搁置-帮助 x-取消搁置:将搁置的更改复制回WC。 用法:x-unshelve[-drop][SHELF[版本]] 将存储在工具架中的更改应用于工作副本。 工具架默认为最新工具架。 默认情况下,应用工具架的最新版本。如果版本是 指定时,应用该版本并放弃比该版本更新的所有版本。 在任何情况下,都要保留取消搁置的版本和比该版本旧的版本 除非指定了-drop。 使用-drop,在 成功取消搁置,没有冲突。 涉及的工作文件应处于干净、未修改的状态 在使用此命令之前。要回滚到的旧版本,请执行以下操作: 工具架,首先确保删除所有当前工作更改,例如 通过搁置或恢复它们,然后取消搁置所需的版本。 如果涉及任何路径,取消搁置通常拒绝应用任何更改 已修改或WC中存在任何其他异常状态。具有 -强制,它不会检查,可能会出错和/或产生部分或部分错误 意外的结果。 搁置特性是实验性的。此命令可能会更改 在下一个版本中,没有向后兼容的承诺。 有效选项: -放置:成功取消搁置后放置搁板 ... $svn帮助| grep x- x-shelf-diff x-shelf-drop x-shelf-list x-shelfs x-shelf-list-by-path x-shelf-log x-shelf-save x型货架 x-取消搁置 使用:

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

用法:复制SRC[@REV]。。。DST

SRC和DST都可以是工作副本WC路径或URL:

WC  -> URL:  immediately commit a copy of WC to URL
请注意,工作副本中的更改不会自动恢复cp只是将更改复制到新分支,您必须手动恢复它们

要恢复更改,您可以将新创建的分支中的更改合并到工作副本中

svn merge --ignore-ancestry ^/trash-stash/my-stash -c <commited revision>
来看看你在藏匿小径有什么。承诺的修订也会打印出来

如果您不再需要这些藏品,只需运行:

svn rm ^/trash-stash/my-stash

此解决方案优于使用修补程序,因为如果工作副本或当前分支上的新更改与隐藏中的更改发生冲突,您可以使用svn方法解决冲突,而修补程序在某些情况下会失败,甚至错误地应用修补程序。

因为Subversion不完全支持隐藏功能, 我只是按李的方式做 像这样

将开发和Productionrelease项目放在单独的路径上

source\code\MyApp         -- Development
release\MyApp(release)    -- Production(release)
您可以在开发路径中为您的项目使用任何新功能, 而你只会承诺有意义的进展,或者应该为稳定发布一些东西

当您必须发布它进行生产时,打开生产项目,更新svn,并执行发布构建、导出等操作。。。等等

我知道这会有点麻烦,但发布进度不会经常发生,对我来说不是,但我知道有些项目确实比较适合开发进度,这种方式适合我

我将svn用于特定的项目,因为项目团队成员使用它,所以我必须遵循它。
最好的解决方案是使用git,它有一个完美的版本控制系统,比svn更好。

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

解决方案:

签出新的工作副本并在新副本中工作。最简单最安全的 创建分支->切换到新分支->blabla有人说它会在SVN服务器中产生一些垃圾 如果您没有任何未添加的文件或已删除的文件,则创建修补程序->恢复工作副本->回补非常有效 使用架子,见下文 我试了1次。2.和3

一,。是最容易和最安全的。如果您想节省时间,请使用此解决方案。我知道不是很优雅

三,。这不是我的选择,因为:

可以使用未添加的文件和现有文件的更改创建修补程序。但它不会在创建补丁后删除那些未添加的文件。那怎么办呢?我必须创建一个补丁选择未添加的文件->恢复工作副本->手动删除所有这些未添加的文件。这根本不像git stash-u。 四,。shelve将是最优雅的方式,也是与git stash-u最相似的方式

添加未添加/未跟踪的文件->搁置->完成

看到了吗?与git stash-u相比,唯一的区别是必须先添加未添加的文件,然后再搁置

测试环境:

我正在测试所有使用Windows Tortoise SVN客户端的用户,该客户端具有网络共享副本SAMBA和由Windows Tortoise SVN客户端创建的本地repo


因此,我不知道如果您使用的是SVN服务器,那么情况会有什么不同,SVN服务器与其他服务器不同。但我想shelve在任何情况下都可以工作,因为它是一个本地操作/功能。

这将在subversion上产生大量垃圾server@knittl:不,不会。更重要的是:它不会像您的建议那样导致更改丢失。这是我所知道的唯一两种可靠的方法,还有另一个签出中继/同一分支的副本。如果您对此感到不舒服,只需签出另一个副本并并行处理它。@knittl:可以在项目默认分支或标记位置之外的不显眼路径中创建分支。例如,一个团队可以为此指定project\temp\或project\personal\。不幸的是,必须在服务器上创建分支。这并不是说这些分支复制了大量数据,而是它们创建了许多像git这样的系统所没有的不必要的引用。这对于大型存储库是没有用的。在我的工作环境中,这绝对不是一个选项。虽然我希望我们的存储库更小、组织更好,坦率地说,是git存储库而不是svn,但我只限于我们的代码在组织中的组织方式。我认为,这可能对删除/重命名的文件不太有效。请参阅标题为“为什么不使用修补程序”的框?至少我想知道为什么这是一个坏主意。@sbi:我认为这不是否决投票的正当理由。这不是一个坏答案。这不是一个完美的答案,仅此而已。我认为这个人不应该因为他的建议而受到惩罚。你希望他不要回答吗?如果是,那么是,你应该投反对票。否则这是对善意的惩罚。如果其他人,像我一样,认为这是最轻的解决方案,并决定尝试它,我不得不使用patch-p0
自svn 1.6以来的回购根。当您的回购在顶层有主干/标签/分支时,这是一个很好的解决方案。我真的不喜欢将所有这些临时分支放在服务器上。我觉得这应该在本地完成,而不是把服务器搞得乱七八糟,如果你在签入时生成邮件的话,就会生成spurios签入电子邮件。还有一个值得记住的选项。@sleske:是的,您正在将临时存储提交给服务器,但分支本身已被删除。无论如何,我认为这是最快、最健壮的方法。@sleske:SVN不是分布式VCS,所以所有东西都必须在服务器上。这只是它的方式。但我在上面的评论中提到的链接确实提出了只在svn中隐藏的实际解决方案。足够公平;事实上,谷歌刚刚在博客上引导我找到了这个解决方案。我仍然坚持认为,对于这个提问者来说,git svn是一个自然的解决方案。我怀疑这个解决方案遵循文件重命名,因为git没有。这是一个意外的重复-在那里发送向上投票。它似乎也不包括二进制文件,这很烦人。至少在使用OrtoiseSVN生成补丁时。这可能会有所帮助。如果使用svn patch_name.patch而不是patch-p0,则或多或少可以跟踪元数据,因为它们位于修补程序文件中,并且svn patch理解它们。这不包括对外部的更改。只是好奇,但是为什么不使用git svn呢?一些相关新闻:引用:他还指出,即将发布的Subversion 1.8版本应该让它更接近git的功能,具有git stash等功能,开发人员可以在本地进行更改,然后将其放在一边,然后离线提交,它在开发人员脱机时记录已完成的更改,并在开发人员重新连接时将移动到主存储库。从2012年4月26日起更新:搁置现在计划在1.9版,没有任何ETA。所以这可能需要一段时间…从2012年11月17日起更新:搁置现在计划在1.10。也许它总是安排在-更新日期为2015年3月23日,2年半后:好消息是搁置时间仍安排在1.10。坏消息是ETA:2015年第二季度暂定版本1.9.0/2017?最好的推测版本1.10.0注:这与签出第二个工作副本基本相同-只是没有签出:-@sleske:是的,没有新签出所需的大量带宽不管你喜欢与否,这是更接近于git隐藏行为的答案。创建分支很酷,但与TFS搁置更相关。在windows下不适合我!:这其实是一个很好的解决方案!许多其他解决方案使用第三方工具来解决问题;这一个使用Git作为第三方工具。这有几个优点:1Git非常通用和强大。2很多人已经安装了Git。我很好奇,如果你不进行Git提交,这是如何工作的。这种方式可以处理元数据更改和目录创建/删除吗?就像git stash所做的一样?不太清楚您在做什么,您提到的目录中签出了哪个版本?但它看起来像是最高投票答案的副本签出一个新的工作副本。@sleske抱歉,我没有阅读您的案例详细信息。在我的例子中,我只需要dev和prod,两种情况。使用svn开发全新的功能将非常复杂。我不确定在svn world中是否有明确的方法来解决您的问题。如果您能简短地描述shelve是如何工作的,而不是将所有命令行文档放在这里,那就更好了。我认为搁置是最好的解决办法。我想写一个总结性的回答,比较上面提到的所有解决方案。这些答案或多或少是不完整的。
svn rm ^/trash-stash/my-stash
source\code\MyApp         -- Development
release\MyApp(release)    -- Production(release)