我的存储库中有几个项目,每个项目都有自己的文件夹。 是否可以删除其中一个项目的最新修订而不改变其他任何内容?
示例:项目A的最新版本已提交创建rev。 50.关于其他项目的工作正在进行,存储库现在处于转速状态。 60。
现在,A的用户回来并请求删除上一版本的更改,因为它们不适合他。他想回到之前的版本,所有进一步的改变应该从那里开始。
此时我想要转。 50消失,以便项目A可以像转速一样继续。 50从未发生过。
我能看到的唯一方法是创建一个分支,从现在开始在该分支上工作。但随着时间的推移,这只是创造了许多分支,而且项目的历史变得杂乱无章。
这种情况有什么好的解决方案?
答案 0 :(得分:9)
简短的回答,你没有。实际上很难从subversion repo中删除提交。故意这样。
实际上,要做的是将该目录恢复为修订版49,然后将其提交为rev 61。
关键是你只回复有问题的目录,而不是整个结账。
以下是相关的SVN图书链接:http://svnbook.red-bean.com/en/1.0/svn-book.html#svn-ch-4-sect-4.2
你想要一个“svn merge -r 60:50 xxx:// path”形式的命令
答案 1 :(得分:5)
Gabriel Hurley的回答是你当前已经接受了没有意义:在进行“修订更新”之后无法提交。该操作将回滚您的工作副本所基于的BASE
修订版。在尝试提交更改时,subversion会抱怨文件和文件夹已过期。
您希望还原为修订版或还原版本功能的更改,而不是“更新到修订版”。
答案 2 :(得分:2)
您返回并将文件置于修订版50所处的状态(使用“更新到修订版”),然后将其与当前版本重新合并,如果您有任何后续更改保持即可。否则,您只需更新修订版,然后重新发送文件。
没有自动的方法可以做到这一点,但手工做一点工作是可行的。这是版本控制的魔力。
答案 3 :(得分:1)
如果你想要改变51:60
svn merge -r 50:49 A/trunk/
#the most painful experience in your life
svn commit -m "reverting to rev49"
请注意,这通常不起作用。
如果你想要改变51:60,手动方式
svn diff -r 50:49 A/trunk/
#review changes from the diff and apply them. or patch.
svn commit -m "reverting to rev49"
答案 4 :(得分:1)
如果您想要撤消更改,而不触及在同一文件夹上发生的任何其他更改,则所有其他答案都很好。
如果我正确理解您的用例,您不必担心项目A的其他更改,因为没有。您只是希望项目A回到修订版50之前的状态。如果是这种情况,那么有一个更简单的解决方案(并且在进行合并和解决冲突时更少悲伤):
svn del full://url/to/project/A
svn cp full://url/to/project/A@49 full://url/to/project/A
这基本上“从存储库中删除”项目A的当前HEAD(它仍在历史中),然后复制项目的旧副本(从有问题的提交之前)。
此程序非常透明,如果结帐A(来自修订版50或更高版本)的人执行svn update
,则会更新到最新版本,而不会大惊小怪。没有合并与任何东西打架。