恢复SVN中删除添加文件的历史记录

时间:2015-04-06 15:02:24

标签: svn

在我的SVN中继中,我删除了一个目录并在一次提交中重新添加。 现在,试图获得" svn log"我只看到了那次提交的历史,没有我过去所做的所有改变。我知道它有意义,因为删除和重新添加文件,但我想恢复整个事情并恢复我的历史。我怎么能这样做?

其他信息和详细信息: 我正在SVN的一个主干的分支上工作。为了从主干更新分支,我使用普通差异手动更新文件,而不是使用" svn merge"命令。对于添加到主干的新文件,我手动" svn add"它们在我的分支中,同样用于删除(svn rm)。 当我想将分支合并回主干时,我的一位同事建议我" svn merge"分支(我在这个过程中解决了很多冲突),然后" svn merge --reintegrate"从树枝上的树干,并提交到树干。 在所有冲突的同时,我删除了整个目录,将其提交给分支,将其重新添加到分支并再次提交。 现在"合并 - 整合"带来了该目录的删除 - 读取,并且提交导致所有历史记录消失。 我真的只想恢复整个事情,所以我可以开始干净(我已经知道如何使这次提交正确,但我不知道如何恢复和恢复历史)。

编辑:我试图获取一些我知道已从this question删除的文件的日志。修订版4129是删除重新添加,4120是我最后一次编辑其中一个文件。 " svn log -r4129 file"只列出我没有历史记录的最新提交。 " svn log -r4120 file"返回单行" --------"。 我认为与该问题的主要区别在于我还在同一次提交中重新添加了文件,而不仅仅是删除。

2 个答案:

答案 0 :(得分:3)

  

在我的SVN中继中,我删除了一个目录并在一次提交中重新添加。

糟糕,程序员!没有甜甜圈给你!

您所做的是创建一个完全不同的目录,但名称相同。对你而言,他们看起来一样。对于Subversion,这两个目录彼此无关。

为什么要删除旧目录并创建一个具有相同名称的新目录?

你想还原吗?找到您删除的修订版本,并在svn log中添加目录并尝试:

$ svn merge -c -$rev

其中$rev是您删除并添加回目录的日志中的修订版。这是您可以删除您在Subversion中所做的任何更改的方法。

您可以在命令中指定多个-c $rev。如果这会产生冲突,您可能需要采取稍微不同的方法。在那一个中​​,您必须使用固定来固定目录修订版,就像在先前版本中看到的那样。假设您的日志显示您在修订版12345中删除了目录foo,现在您需要将其恢复:

首先,删除当前目录foo

$ svn delete foo

现在,当该目录仍然存在时,将foo从修订版上一页复制回删除。由于它已在修订版12345中删除,我们需要从修订版12344中复制:

$ svn cp $REPO_URL/trunk/foo@12344 .

这应该恢复旧副本。

  

其他信息和详细信息:我正在SVN的一个主干的分支上工作。为了从主干更新分支,我使用普通差异手动更新文件,而不是使用" svn merge"命令。对于添加到主干的新文件,我手动" svn add"它们在我的分支中,同样用于删除(svn rm)。

我需要喝一杯......

你正在做的是合并,但没有告诉Subversion你做了合并。如果你现在在Subversion中进行合并,你会得到一堆合并冲突,因为Subversion会在分支和主干中看到文件的相同区域被更改。

当您向分支添加新文件时,它与文件中的文件完全不同。它可能是相同的名称并且位于同一目录中,但是由于您将其添加到分支中,因此您无法将该文件中的中继更改合并到该分支中。

如果可能,删除分支上的文件,然后从trunk复制。这样,trunk中的更改可以合并到分支。

这让我们得到了非常非常重要的东西:不要通过添加来创建分支。始终从主干(或您从哪里分支)复制分支。否则,该分支和主干不会共享相同的历史记录。如果您还没有完成初始副本,则永远不能使用Subversion合并。分支和主干没有共同的历史。

有时候更容易手动将更改添加到分支中,而不是将其从主干中合并。例如,分支上的更改与主干上的更改不同。在这种情况下,您可以使用--record-only让Subversion知道您完成了合并:

 $ svn merge --record-only -r12345 $REPO/trunk .

以上将记录在分支上完成变更集12345的合并,并且Subversion不会再次尝试进行合并。

合并是你的朋友。不要试图绕过它。一旦你理解Subversion需要在分支和分支/主干之间共同的共同祖先,Subversion在合并时做得非常好。使用svn cp设置该关系。

答案 1 :(得分:-1)

使用在该服务器上运行的svnadmin dump / load命令重新创建存储库,唯一可以使用显示该目录的原始历史记录来恢复此功能的方法。您执行的任何合并或其他正常svn命令只会在历史记录中已存在的剪切上产生更多其他提交。也许这样的事情对你来说是可以接受的,但这不是你的问题所在。

因此,使用svnadmin,您要做的是将存储库的内容转储到文件中,添加一个选项,在删除目录之前仅包含最新版本。然后将该转储文件加载到新的存储库中。然后你有你的存储库,就像删除发生之前一样。现在,从理论上讲,您应该能够在删除/读取到HEAD之后再进行另一次修订转储,然后将这些转储重新加载到新的存储库中,为您提供一个完美的新存储库而不会中断并包含所有内容。这可能不起作用,但取决于其他更改可能会混合到该跳过的修订版中。

您可能希望阅读svn参考中的命令,但这可能是它的样子:

  

svnadmin dump C:\ Repositories \ myrepo -r4128> myrepo.dump
  svnadmin load C:\ Repositories \ mynewrepo< myrepo.dump

     

svnadmin dump C:\ Repositories \ myrepo -r4130:HEAD --incremental> myrepo2.dump
  svnadmin load C:\ Repositories \ mynewrepo< myrepo2.dump