2015-04-06 676 views
1

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

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

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

+0

对不起,我误解了你。我以为你只是想查看历史记录,但是你希望存储库看起来好像你的删除从未发生过,对吗?我不相信有办法做到这一点。 –

+0

@PatrickQuirk是的,这就是我想要的。我相信在那里应该离开,考虑如果我在整个混乱之前“修复”修改,我可以查看我的正确历史。我正在寻找类似的东西:“svn up -r1000(1001是错误提交); svn commit -m”恢复历史记录“ – itzhaki

+0

[检查已删除文件的历史记录]的可能重复(http://stackoverflow.com/问题/ 401331 /检查历史的删除文件) – bahrep

回答

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/[email protected] . 

这应该还原旧副本。

附加信息和细节:我正在SVN的树干分支。为了更新树干分支,我使用普通差异手动更新文件,而不是使用“svn merge”命令。对于添加到主干的新文件,我手动将“svn add”添加到我的分支中,删除(svn rm)也是如此。

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

你在做什么是合并,但不告诉你颠覆做了合并。如果你现在在Subversion中进行合并,你会得到一堆合并冲突,因为Subversion会在分支和中继中看到相同的文件区域。

当你添加新的文件到分行,这是一个完全不同的文件比在树干。它可能是相同的名称,并且位于相同的目录中,但是由于您已将其添加到分支中,因此无法将该文件中的trunk的更改合并到该分支中。

如果可能的话,删除在树枝上的文件,并从行李箱复制。这样,中继线中的更改可以合并到分支中。

它得到我们的东西非常,非常重要的是:不要做一个附加创建一个分支。总是从树干复制树枝(或从树枝分支)。否则,该分支和中继不共享相同的历史记录。如果你还没有完成最初的副本,你永远不会使用Subversion合并。分行和行李不共用历史记录。

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

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

上面将记录变化的合并设定了12345分支上完成的,和Subversion不会尝试再次合并。

合并是你的朋友。不要试图绕过它。一旦你明白Subversion需要在分支和合并的分支/树干之间有一个共同的祖先,Subversion在合并方面做得相当不错。使用svn cp来建立这种关系。

+0

非常感谢你的提示,看起来我只是开始了整个事情一团糟,肯定是一个教训,幸运的是,我们将在一周内将我们的存储库转换为GIT,并将GIT管理编辑忽略所有问题,并正确显示所有历史记录。 – itzhaki

-1

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

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

你可能会想上的命令在SVN参考过读了,但这里是它可能看上去是这样的:

svnadmin的转储C:\库\ my​​repo -r4128> myrepo.dump
svnadmin的负载C:\库\ my​​newrepo < myrepo.dump

svnadmin的转储C:\库\ my​​repo -r4130:HEAD --incremental> myrepo2.dump
svnadmin的负载C:\库\ my​​newrepo < myrepo2.dump

相关问题