我能以某种方式在同一代码库的多个签出中共享pristines文件夹吗?

时间:2012-06-27 15:38:25

标签: svn

我喜欢Subversion 1.7现在所有的pristines都在一个地方用于工作副本。但是,我经常有几个相同代码库的签出(主要是为了复制尚不存在的存储函数)。

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

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

2 个答案:

答案 0 :(得分:3)

我认为你做不到。 SVN计算每个pristine文件的引用号。如果它达到零,“svn cleanup”将删除这些文件。

另一方面,您可能会尝试使用SVN 1.7.5的hacky方式(由您自己承担风险!我不能保证进一步的SVN版本将与这些黑客兼容;我没有尝试,但是我知道SVN是如何工作的,这应该适用于1.7.5):

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

    sqlite3 .svn / wc.db“更新PRISTINE set refcount = refcount + 100;”

  2. Windows支持链接,但它们并不那么受欢迎: http://en.wikipedia.org/wiki/NTFS_symbolic_link至少他们即使在XP中也能正常使用。

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

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

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

答案 1 :(得分:0)

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

另外,我从中了解到,如果你有大的改动,偶尔运行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