2011-10-03 83 views
7

由于某种原因,我的本地SVN仓库副本停止将父目录识别为工作副本。我通常会通过再次检出到另一个文件夹并用我更改的文件覆盖新的工作副本来解决此问题。然后我会从新文件夹执行提交。伪装SVN结帐的深度

我想在这种情况下避免这样做,因为回购包含数以千计的大图像并且检出需要很长时间。所以我想要做的是非完全递归地检查到一个新的目录,将我现有的文件复制到新的目录中,然后检查整个东西。

问题是,SVN知道我只检出了一个几个文件。有没有一种方法可以伪造它,并让SVN认为我只是做了一个完整的结帐? (例如,我可以在不需要实际检查所有内容的情况下获得完整结账的.svn文件夹)

+0

第一:直接的巨大文件的工作副本的根或至少一个目录下面?第二:你是否仅在工作副本根目录中删除'.svn'目录,或者是否在其他目录中缺少该目录? –

+0

这些文件不在主要根目录,并且它看起来只是根目录.svn目录已损坏 - 在任何子目录中,所有通常的图标都显示在文件旁边 – wheresrhys

回答

0

首先备份完整的工作副本。然后更新到上次修订您的工作副本。您的上一次修订包含根文件夹。 SVN会尝试再次写入该文件夹。然后会显示树状冲突。然后运行清理并重新提交。

+0

由于SVN不能更新,我无法更新到最新版本不认为它是一个工作副本,我不能在目录 – wheresrhys

1

您很可能会损坏或删除每个结帐中隐藏的.svn文件夹。

使用命令行在其他地方执行svn co svn://your/svn/repository --depth immediates并从此处还原.svn文件夹。然后,您需要经历许多svn update .svn cleanup序列才能将子文件夹与父文件夹重新关联。

+0

上运行任何SVN命令我已经尝试过,但检出立即数似乎只需检查整个事情 - 不知道为什么。对我来说这似乎很不合时宜。 – wheresrhys

+1

然后尝试'svn co svn://你的/ svn/repository --depth empty'并选择你想要的文件。 – aquaherd

0

如果只是工作副本的根已被破坏和大(或多个文件)都在工作副本的根目录下面的程序应该没有再次回购下载文件的工作下的目录:

> # 1) adjust these: 
> WC=/bad/root/of/working/copy 
> REPO=svn://localhost/url/to/repo/trunk/proj 

> cd $WC 
> # 2) make sure there is no half-baked stuff 
> rm -rf .svn 

> # 3) remove files in WC-root (would wreck havok later) 
> rm -v $(svn ls --depth=files $REPO) 

> # 4) ckeck out a clean .svn for this dir into another place 
> svn co --depth=immediates $REPO /tmp/tmp-wc 
> # 5) copy .svn this to this place 
> cp -a /tmp/tmp-wc . 

> # 6) "reconnect" children, download files in root 
> svn up --set-depth=infinity . 
Revision 42. 

之后,应该可以正常操作 - 如果没有其他损害。

注:

  • 步骤3 + 4)由于存储库根中不包含的数据量,此步骤应该是无痛的。但是,如果可能有未更改的任何更改,可以先备份这些文件。
  • 步骤6)由于子目录中的数据未触及,因此不会再次下载。根目录中的数据将被再次提取。
3

在新位置稀疏签出您的存储库应该做你想做的事(http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html)。如果我正确理解了你的话,你会想做一个空的最高层目录结账,然后在你想要的工件上做一个'svn',设置深度。

例如,假设我有一个名为'foo'的顶级文件夹,它包含两个文件夹'bar'和'zoog'。

/foo 
    /bar 
    -the files I want 
    /zoog 
    -the universe 

文件夹“zoog”有大量的,我没有在时刻关心的文件,但我希望能够与“酒吧”的工作。我会做到以下几点:

svn co --depth empty file:///var/svn/repos/FooRepo foo 
cd foo 
svn up --set-depth infinity bar 

现在的“svn了”显示所有信息是最新的,而且我可以在“富”和“酒吧”的变化,并承诺他们,如果我还检查了“zoog”没有所有的开销。

(该参数--set深入的SVN更新被排除,空,文件,立即数,和无穷大)

+0

我已经加了你的答案,因为它看起来可能是我需要的,但为了运行命令行svn(而不是龟gui),我最终不得不将SVN升级到1.7,它具有完全不同的元数据结构到v1.6,所以我不能真正测试你的答案,看它是否有效 – wheresrhys

+0

我在步骤3中调用'svn up --set-infinity bar/folder1'并得到错误'E155007 - 不是工作副本'所以我先调用'svn up --set-depth-empty bar'然后'svn up --set-depth infinity bar/folder1' –