回滚或恢复整个svn存储库到一个较旧的版本

我搞砸了我的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.fixed移动回购。

再次感谢!

检查svnadmin转储/加载。 它会为您的文件的每个版本创build一个文本文件。 可以删除某个点上下的所有内容,然后重新导入。

请参阅迁移存储库数据的其他地方

一个“反向”合并可能是你所需要的。 请参阅svn图书的“撤销更改”部分。

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

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

在“正常”的情况下,你犯了一个错误,你需要使用反向合并。 这确保在r24之后撤消更改也可以恢复,扩散等。

下面的命令应该可以撤消你的改变(你需要提交合并的结果来反映仓库中的合并)

 svn merge -r 28:24 

如果你有权访问SVN服务器,你可以编辑path/db/current ,把你想恢复的旧版本号(这里是24)放在那里,并且删除不再需要的修订文件(即25,26,27 ,28)from path/db/revs/0/ 。 至less这个工作对我来说今天,我不小心删除了一个目录在存储库。

如果你不利用pipe理权限,那么你不能抹杀任何旧版本,但你仍然可以用一个非常简单的“svn copy”命令来隐藏它们(nickf和JesperE已经提到了这一点,但是以一种相当神秘的方式)

svn delete protocol:// svnserver / some / resource
svn copy protocol:// svnserver / some / resource @ 24 protocol:// svnserver / some / resource

就这样,25到28版的修订版从svn日志中完全消失了。 这不是一个黑客,它是一个安全和(几乎没有…)loggingfunction。

如果“资源”是一个目录,那么你必须从最后一个URL中删除:

svn copy protocol:// svnserver / some / directory @ 24 protocol:// svnserver / some /

(否则你会把它复制到里面)

对于使用TortoiseSVN的人来说,解决scheme很简单:

  • 查看更改日志
  • 右键单击您要回滚到的修订版本…
  • …select“还原到此修订”
  • 提交您的更改

这种方法保留了版本历史(即所有您修复的版本)。

你可以做一个特定版本的新签出。 http://svnbook.red-bean.com/en/1.1/re04.html

 svn co path/to/my/repo -r 24 

如果你真的想从存储库中完全删除文件,你需要做一个svndump到一个文件,过滤掉你不想要的revs和/或文件path,做一个新的repo,并将过滤的dump转储到新的库。 在做任何这些操作之前,您都需要仔细阅读SVN的存储库维护部分 ,并确保您不会删除现有的存储库,除非您确定新存储的存储库有您想要的东西。

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

我讨厌这样说,但是我发现自己正在使用我的svn仓库的备份。

你可以将某个修订版的文件复制到版本库中的新目录中吗?

这里是我将如何开始做到这一点。 残酷,是的,但它是唯一保证完全忽略碰撞保持修改历史完整的东西。

  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的“正常”方式,通常的方法是从旧版本创build一个分支,然后将该分支合并回头部。 (至less,这是如何工作)

编辑:上面的代码是未经testing的,不要逐字运行

你可以svn del最上面的目录,然后svn copy它们:

 svn copy svnurl@version svnurl 

我不完全确定,如果这个工作,因为我还没有使用它在现场制作,但我刚刚尝试在testing库(我复制我的生产之一), 似乎工作。

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

 svn update -r 24 trunk 

其中24是版本号,而trunk是您想要更新(或者在这种情况下还原)到所述版本号的文件/文件夹。

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

再次,我没有使用这之前在现场制作,所以如果我错了请咨询。 我很想知道这是否也是如此,因为我可以看到自己在(近)将来需要这个。

戴夫

 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"