撤销TortoiseSVN中的修复操作

10

假设我已经用Windows资源管理器将文件A重命名为文件B并创建了一个新的文件C

在Tortoise SVN中,我不小心对文件AC使用了“修复移动”选项,而不是正确的选择AB。有没有简单的方法可以撤销修复操作(然后用正确的文件重新操作)?这时还没有提交更改。

目前我所知道的唯一方法是还原删除和添加操作,以恢复文件A,然后手动再次删除该文件并正确地进行关联。由于涉及多个文件,这样做可能会意外还原本地更改,因此我想知道是否有更好的方法。

注意:即使使用TortoiseSVN产生了问题,具有svn控制台的答案也是可以接受的。


以下是文件A.txtB.txtC.txt的示例步骤:

在将A重命名为B并本地添加了C后:

>svn st
!       A.txt
?       B.txt
?       C.txt

在错误地应用乌龟SVN的“修复移动”后,A -> C

>svn st
D       A.txt
        > moved to C.txt
?       B.txt
A  +    C.txt
        > moved from A.txt

我用以下处理流程来解决这种情况,虽然我并不太满意:

>ren C.txt C.txt.bak
>svn revert C.txt A.txt
>ren C.txt.bak C.txt
>del A.txt

导致初始情况,使我能够使用正确的文件重新进行修复

>svn st
!       A.txt
?       B.txt
?       C.txt
我所渴望的却似乎不存在的东西
svn mv --force --ignore-files A.txt B.txt
svn add --force C.txt

以一种忽略A已被标记为删除的方式,允许将历史记录从A转移到B,重新解释C为干净的添加而不是从A转移历史记录。


我可能说错了,但你不想做的是从暂存中删除更改,然后手动修复重命名,然后进行阶段提交。这样对吗?如果是这样,那么这个过程的自动版本究竟是什么 - 也就是说,你将如何告诉SVN你实际想要哪些更改? - Lefty G Balogh
还有一些事情 - 实际上风险是什么?如果您提交了错误的文件,是否会丢失数据/工作?我们要谈论多少个文件? - Lefty G Balogh
@LeftyGBalogh 我希望有一种方法可以在不实际恢复文件的情况下还原 SVN 状态(例如“已删除”)。这将允许我正确重新关联。风险是在项目元文件和代码文件之间获得不一致状态,从而搞乱版本历史或丢失本地更改。我们谈论的是过去发生过的事情,未来可能会再次发生。我已经处理了过去的事件,但我对自己的工作流程不满意。 - grek40
@LeftyGBalogh 在我本地更改文件后,A 将会是 missingBC 将会是新的未被版本控制的文件。在“修复移动”之后,A 将会被 删除,而 C 将会被 添加+。我想回到“修复移动”之前的状态,但如果我只是 revert,文件 A 将会被物理恢复。 - grek40
我想我开始理解你的困境了 - svn revert --recursive folder_name 将覆盖您对先前版本所做的更改 - 而您希望保留这些更改。您可以手动将所有内容恢复到所需状态并再次提交,但这很麻烦 - 其他人也会遇到这个问题:https://dev59.com/W2025IYBdhLWcg3wwYz4 。还有一件事让我感到困惑 - 当您说“更改在那时没有提交。”时 - 难道您不是可以在所有文件处于正确状态后进行提交吗?(顺便问一下 - 您不能使用 Git 吗?) - Lefty G Balogh
我所能想到的就是以某种方式使用手动解决 - 但那看起来更加复杂:http://svnbook.red-bean.com/en/1.7/svn.tour.cycle.html#svn.tour.cycle.resolve.byhand - Lefty G Balogh
1个回答

2
这里有一种方法,只需在A.txt上执行2个命令,而不是您当前的工作流程中的4个命令(也会影响C.txt)。在错误应用TortoiseSVN“修复移动”之后,请执行以下操作:
svn revert A.txt
del A.txt

"svn stat" 将会是:
!       A.txt
?       B.txt
A  +    C.txt

现在你可以从Tortoise SVN中的“A.txt”和“B.txt”之间执行“修复移动”,以达到正确的状态:
D       A.txt
        > moved to B.txt
A  +    B.txt
        > moved from A.txt
A  +    C.txt

相同的技术可以在TortoiseSVN用户界面中使用(撤销A.txt,然后从资源管理器中删除A.txt)。这种方法有效的原因是移动状态与丢失的文件相关联,而不是与未版本化的文件相关联。对C.txt的唯一修改是使用修复移动命令添加了它(您可能本来就想添加它)。

只有选择恰好两个文件,一个具有“丢失”状态,另一个具有“非版本控制”状态,才能使用“修复移动”命令。只有这样,TortoiseSVN才能找出哪个文件被重命名为哪个文件。

https://tortoisesvn.net/repairmoves.html

撤销并删除A.txt后,您最终会得到一个丢失的文件(A.txt)和一个非版本化的文件(B.txt),就像在不正确应用修复移动之前一样。因此,您可以再次在这两个文件之间应用修复移动。

1
谢谢您的回答。这也将A的历史记录链接到C,但我想我只是在寻求一个简单的解决方案,因为TortoiseSVN在后台进行了相当多的工作(修复移动),并且它不支持简单的修复。这个额外的历史链接可能不是一个问题。 - grek40
啊,你说得对 - 在提交后,C 也会获得 A 的历史记录!这很奇怪,因为在这种情况下,在提交之前 svn stat 不会列出文件 C> moved from A.txt。无论如何,我很高兴它有所帮助。 - Constantin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接