Svn Subversion:转储后如何修复工作副本->;负载循环

Svn Subversion:转储后如何修复工作副本->;负载循环,svn,Svn,几周前,我们的freemium subversion主机向我们发送了一条消息,表示我们已经超出了大小限制。经过几次尝试来解决这个问题(并且意识到如果不执行转储->加载循环和修剪操作,就不可能收缩存储库),我们决定是时候转移到一个新的主机上了,该主机的大小限制更为宽松(同时迁移到git) 然而在此期间,我们被锁定为“只读”访问-这是不幸的,因为有一些重要的本地更改尚未签入。所以我决定采取激烈的措施,通过dump->load cycle方法删除旧的服务器版本,让我们重新开始工作,这样我们就可以让本地

几周前,我们的freemium subversion主机向我们发送了一条消息,表示我们已经超出了大小限制。经过几次尝试来解决这个问题(并且意识到如果不执行转储->加载循环和修剪操作,就不可能收缩存储库),我们决定是时候转移到一个新的主机上了,该主机的大小限制更为宽松(同时迁移到git)

然而在此期间,我们被锁定为“只读”访问-这是不幸的,因为有一些重要的本地更改尚未签入。所以我决定采取激烈的措施,通过dump->load cycle方法删除旧的服务器版本,让我们重新开始工作,这样我们就可以让本地的修改工作起来。在对所有内容进行本地备份之后,我实际上放弃了除最新版本(r525)之外的所有内容

这一切都起了作用——经过一个漫长的过程,在主机的帮助下,我成功地转储->重新加载了我们的存储库,现在是修订版1

然而,现在我们的客户拒绝更新我们现有的工作副本,因为他们认为他们是525版的工作副本:

svn:报告的修订高于当前存储库标题修订。

所以问题是:有没有可能“修复”我的工作副本,让它认为是在第1版


我意识到我可以签出一个新的工作副本-但是,同样,我们有一些本地编辑,如果可能的话,希望将它们集成起来。

您最安全的选择可能是创建一个补丁(或者多个补丁-如果我们讨论的是多个工作副本中的更改)-这可以“脱机”完成,没有联系存储库。然后签出一个新的工作副本并对其应用补丁

您可以使用
svn diff>patch.diff
创建一个修补程序,并将其应用于


至于二进制文件的问题:您可以编写一个脚本,将修改后的二进制文件递归复制到新的工作副本中。您可以创建一个状态为
svn
的修改文件列表,然后按扩展名或其他属性将其过滤掉。

您最安全的选择可能是创建一个补丁(或多个补丁-如果我们讨论的是多个工作副本中的更改)-这可以“脱机”完成,而无需联系存储库。然后签出一个新的工作副本并对其应用补丁

您可以使用
svn diff>patch.diff
创建一个修补程序,并将其应用于


至于二进制文件的问题:您可以编写一个脚本,将修改后的二进制文件递归复制到新的工作副本中。您可以创建一个状态为“svn”的已修改文件列表,然后按扩展名或其他属性将其过滤掉。

从冲突文件夹中删除隐藏的.svn文件并更新到HEAD。它将保留本地更改。

从冲突文件夹中删除隐藏的.svn文件并更新到HEAD。它将保留本地更改。

对于较新版本的Subversion,您可以使用sqlite修改工作副本数据库,这相当危险,您可能会完全破坏数据库。如果你想尝试一下,这里是怎么做的

首先了解远程存储库中的最新修订版本位于:

$ svn info https://example.com/svn/project/trunk/
Path: trunk
URL: https://example.com/svn/project/trunk
Repository Root: https://example.com/svn
Repository UUID: fdecad78-55fc-0310-b1b2-d7d25cf747c9
Revision: 86002 <-- This is the value you want
Node Kind: directory
Last Changed Author: user@example.com
Last Changed Rev: 49367
Last Changed Date: 2008-05-23 17:01:34 +0100 (Fri, 23 May 2008)
如果最近在项目中进行了提交,您可能还需要运行此SQL:

update nodes set changed_revision = 86002 where changed_revision > 86002;

对于较新版本的Subversion,您可以使用sqlite来修改工作副本数据库,这相当危险,您可能会完全破坏它。如果你想尝试一下,这里是怎么做的

首先了解远程存储库中的最新修订版本位于:

$ svn info https://example.com/svn/project/trunk/
Path: trunk
URL: https://example.com/svn/project/trunk
Repository Root: https://example.com/svn
Repository UUID: fdecad78-55fc-0310-b1b2-d7d25cf747c9
Revision: 86002 <-- This is the value you want
Node Kind: directory
Last Changed Author: user@example.com
Last Changed Rev: 49367
Last Changed Date: 2008-05-23 17:01:34 +0100 (Fri, 23 May 2008)
如果最近在项目中进行了提交,您可能还需要运行此SQL:

update nodes set changed_revision = 86002 where changed_revision > 86002;

谢谢,这听起来很有希望。我想我是想了解差异是如何工作的-svn正在将我的本地副本与新(修订版1)版本进行比较?否:svn正在将您的工作副本与上次签出的修订版(
BASE
)进行比较,在您的情况下,这是来自旧存储库的。该修订版与工作副本一起存储在本地,允许您脱机执行许多基本操作(例如
diff
revert
)。如果我正确理解您在上一次回购中的
BASE
,在您的新回购中==r1,这就是为什么这种方法应该有效。是的,这是正确的。如果我从其他文档中也了解到,svn diff将不包括二进制文件。是否有一种解决方案可以覆盖所有类型的更改,而不仅仅是文本文件?如果您只有几个二进制文件和/或它们被本地化到几个目录,请手动执行。另一种可能性是,您可以从源代码构建二进制文件。如果以上原因都不适用-您没有正确使用SVN(例如,请参阅)。我正在进行游戏开发,并且有几十个不可执行的二进制文件。你真的建议这些不应该在版本控制中吗?谢谢,这听起来很有希望。我想我是想了解差异是如何工作的-svn正在将我的本地副本与新(修订版1)版本进行比较?否:svn正在将您的工作副本与上次签出的修订版(
BASE
)进行比较,在您的情况下,这是来自旧存储库的。该修订版与工作副本一起存储在本地,允许您脱机执行许多基本操作(例如
diff
revert
)。如果我正确理解您在上一次回购中的
BASE
,在您的新回购中==r1,这就是为什么这种方法应该有效。是的,这是正确的。如果我从其他文档中也了解到,svn diff将不包括二进制文件。是否有一种解决方案可以覆盖所有类型的更改,而不仅仅是文本文件?如果您只有几个二进制文件和/或它们被本地化到几个目录,请手动执行。另一种可能性是,您可以从源代码构建二进制文件。如果上述原因均不适用-您没有正确使用SVN(请参阅,以了解更多信息