2

我喜欢 Subversion 1.7 现在将所有原始文件放在一个地方作为工作副本。但是,我经常对同一个代码库进行多次检查(主要是为了复制尚不存在的 stash 函数)。

为了节省磁盘空间,有没有办法合并所有这些原始文件夹,所以我没有多个干净的副本?尤其是:

  1. 那里有“额外”的干净文件是否不安全,这些文件不是任何当前签出文件的基本副本
  2. 这可以通过某种方式使用链接来完成,尤其是在 Windows 上吗?
4

2 回答 2

3

我认为你不能那样做。SVN 计算每个原始文件的引用数。如果它达到零,“svn cleanup”删除那些文件。

另一方面,您可以为 SVN 1.7.5 尝试一种 hacky 方式(风险自负!我不能保证进一步的 SVN 版本将与这些 hack 兼容;我没有尝试过,但据我所知SVN 有效,这应该适用于 1.7.5):

  1. 将 'refcount' 设置为更高的值,以防止删除所有工作副本的校验和(您应该在每次“svn cleanup”调用之前执行此操作 --- 为新安装的原始文件更新 'refcount'):

    sqlite3 .svn/wc.db "更新 PRISTINE 设置 refcount=refcount+100;"

  2. Windows 支持链接,尽管它们不是那么受欢迎: http ://en.wikipedia.org/wiki/NTFS_symbolic_link 至少它们对我来说即使在 XP 中也能正常工作。

所以 hacky 方法是创建一个目录,收集其中的所有原始文件(可能使用脚本)。在 .svn/pristine 创建指向该目录的链接。运行上面的那个 SQL 命令并在每次“svn cleanup”之前运行。

而且我还可以提供一种算法,如何从该配置恢复正常(如果出现任何问题)。

  1. 删除链接 .svn/pristine,用空目录替换它们,或者(更好更快)用所有原始目录的该目录内容的副本替换它们。
  2. 使用 SmartSVN 修复工作副本,如本文所示:http://vcs.atspace.co.uk/2012/06/20/missing-pristines-in-svn-working-copy/ 也解释了如果“refcount”会发生什么变为零)

祝你好运:)

于 2012-06-28T09:20:55.380 回答
0

我查看了 Dmitry 的答案,但我认为有一种更简单的方法,即在原始目录中的文件上使用硬链接。然后删除文件的一个版本不会影响其他副本。缺点是许多工具(例如,备份软件)仍会多次备份原始磁盘,但我的主磁盘并没有被占用太多。

另外,我从中了解到,如果你有很大的变化,偶尔运行 svn cleanup 可以节省大量的本地磁盘空间!

总之,我的 svnclone.bat 大致如下:

robocopy /E %1 %2 /XD .svn
robocopy /E %1\.svn %2\.svn /XD pristine
ln -r %1\.svn\pristine %2\.svn\pristine

这也比直接复制快得多。

不利的一面是,随着时间的推移,如果这些克隆长期存在,则会出现重复。但我认为对于我的使用来说已经足够了。

ln.exe 来自http://schinagl.priv.at/nt/ln/ln.html

于 2012-06-29T10:18:34.137 回答