76

我搞砸了我的 SVN 存储库,现在需要将整个存储库从修订版 28 恢复到 24,并且不想处理差异或冲突。有没有一种快速简单的方法来做到这一点?我已经能够使用合并命令恢复单个文件 - 但在这种情况下,它希望将所有文件从修订版 28 添加回存储库,而我真正想做的只是删除它们。

我在 linux 机器(bash)上使用命令行。

谢谢

编辑

感谢所有的帮助!我通过以下方式修复了它:

svnadmin create /svnroot/<repo>.fixed
svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
svnadmin load /svnroot/<repo>.fixed < dump.svn

然后将旧的 repo 放在备份位置并将 repo.fixed 移动到 repo。

再次感谢!

4

14 回答 14

26

查看 svnadmin 转储/加载。它会为您的文件的每个版本创建一个文本文件。可以删除高于/低于某个点的所有内容并重新导入。

参见例如在其他地方迁移存储库数据

于 2008-12-31T03:23:58.450 回答
25

“反向”合并可能是您需要的。请参阅svn book 的“撤消更改”部分。

例如 svn merge -r 28:24 [svn 的路径]

于 2008-12-31T03:00:47.297 回答
14

如果您可以访问 SVN 服务器,您只需编辑path/db/current,将您想要恢复到的旧修订号(此处:24)放在那里,然后从path/db/revs/0/. 至少今天这对我有用,因为我不小心删除了存储库中的一个目录。

于 2009-10-26T22:14:39.783 回答
13

如果您确实需要擦除文件曾经存在的“证据”,则需要执行上述 svndump/svnload 操作。

在“正常”情况下,您犯了错误,您需要使用反向合并。这确保在 r24 之后撤消更改也可以恢复、区分等。

下面的命令应该可以撤消您的更改(您需要提交合并的结果以反映存储库中的合并)

svn merge -r 28:24
于 2008-12-31T19:41:58.697 回答
6

如果您没有使用管理员权限,那么您将无法删除任何旧版本,但是您仍然可以使用一个非常简单的“svn copy”命令将它们隐藏得非常好(nickf 和 JesperE 已经提到了这一点,但以一种相当神秘的方式)

svn 删除协议://svnserver/some/resource
svn 复制协议://svnserver/some/resource@24 协议://svnserver/some/resource

就是这样,修订版 25 到 28 已经完全从 svn log 中消失了。这根本不是 hack,它是一个安全且(几乎……)记录在案的功能。

如果“resource”是一个目录,那么你必须从最后一个 URL 中去掉它:

svn 复制协议://svnserver/some/directory@24 协议://svnserver/some/

(否则你会在里面复制它)

于 2010-08-30T11:37:43.903 回答
4

对于任何使用 TortoiseSVN 的人来说,解决方案很简单:

  • 查看更改日志
  • 右键单击要回滚到的修订...
  • ...选择“恢复到此版本”
  • 提交您的更改

此方法保留版本历史记录(即您恢复的所有修订)。

于 2013-02-20T02:03:02.277 回答
3

您可以对特定修订进行新的签出。http://svnbook.red-bean.com/en/1.1/re04.html

svn co path/to/my/repo -r 24
于 2008-12-31T02:41:01.563 回答
2

如果您的应用程序的文件夹结构没有更改,请检出旧版本并将最新版本中的 .svn 文件夹替换为检出的旧版本。现在您可以提交“旧”版本。

于 2008-12-31T04:13:29.927 回答
1

如果您真的想从存储库中完全删除文件,您需要对文件执行 svndump,过滤掉您不想要的 revs 和/或文件路径,创建一个新的 repo,然后 svnload 过滤后的转储到新的存储库。在执行任何操作之前,您需要仔细阅读关于存储库维护的 SVN 书籍部分,并确保在确定新存储库具有您想要的东西之前不要删除现有存储库。

于 2008-12-31T03:40:36.187 回答
1

你能不能svn del是最顶层的目录,然后svn copy是它们:

svn copy svnurl@version svnurl 
于 2012-02-02T05:36:14.930 回答
0

我不想这么说,但这是我发现自己使用我的 svn 存储库备份的情况。

您可以将某个版本的文件复制到存储库中的新目录吗?

于 2008-12-31T03:09:54.830 回答
0

这是我将如何开始做的。残酷,是的,但它唯一可以保证完全忽略冲突保持修订历史完整的方法。

  cd /scratchdir 
  svn co -r good svn://repository
  cd /hosed_project
  svn up -r HEAD
  cat >> /tmp/cp.sh 
  ORIG=$1
  TARG=$( echo $ORIG | sed 's/\/scratchdir\///' ); 
  cp $ORIG /hosed_project/$TARG;
  ^D
  chmod u+x /tmp/cp.sh
  find /scratchdir -not -wholename "*/.svn*" -exec /tmp/cp.sh {} \;

请注意,这不是 IMO 的“正常”方式,正常方式是从旧版本创建一个分支,然后将该分支合并回头部。(至少,以前这样工作的)

编辑:以上代码未经测试,请勿逐字运行

于 2008-12-31T03:26:16.590 回答
0

我不完全确定这项工作是否有效,因为我还没有在现场制作中使用它,但我刚刚尝试了一个测试存储库(我复制了我的一个生产存储库)并且它似乎有效。

当您在存储库中时,请使用以下命令:

svn update -r 24 trunk

其中24是修订号,trunk是您要更新(或在本例中恢复)到所述修订号的文件/文件夹。

在我的测试中,更新和(重新)添加了几个文件,并且在提交后我没有收到任何警告。然后我用一些虚拟文本修改了一个文件并尝试了另一个提交,并且只说文件弹出在修改列表中。所以它似乎工作得很好!

再说一次,我以前没有在现场制作中使用过这个,所以如果我错了,请指教。我很想知道这是否也是要走的路,因为我可以看到自己在(不久的)将来需要这个。

-戴夫

于 2008-12-31T04:02:27.797 回答
0
Example:
    Rev 100 all is working great        
    Rev 101 somebody really corrupted the dir structure and / or merged in bad changes, etc.
    Rev 102 You delete /trunk
    Rev 103 You copy /trunk@100 to HEAD
        You now have a /trunk that reflects only Rev 100 and 103. Not 101 or 102.

svn del svn://[RepoName]/trunk -m "removing issue in HEAD"
svn copy svn://[RepoName]/trunk@100 svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"
于 2010-10-21T13:52:02.763 回答