伪装SVN checkout的深度

7
由于某些原因,我本地的SVN库已不再将父目录识别为一个工作副本。通常,我会通过再次检出到另一个文件夹并用我的更改文件覆盖新的工作副本来解决此问题。然后从新文件夹进行提交。
但这一次,我想避免这样做,因为该库包含数千个大图像,而检出需要很长时间。所以我想做的是非完全递归地检出到一个新目录中,将现有文件复制到新目录中,然后全部检入。
问题在于SVN知道我只检出了几个文件。是否有一种方法可以欺骗SVN,使其认为我刚刚进行了完整的检出?(例如,我可以获得完整检出的.svn文件夹,而无需实际检出所有内容)

第一:巨大的文件直接在工作副本的根目录中还是至少在一个文件夹下面?第二:您只删除了工作副本根目录中的“.svn”文件夹,还是其他文件夹中也缺少该文件夹? - A.H.
文件不在主根目录中,似乎只有根目录下的 .svn 目录受损-在任何子目录中,所有常见的图标都出现在文件旁边。 - wheresrhys
4个回答

3
在新的位置使用仓库的稀疏检出应该可以达到您想要的效果(http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html)。如果我理解正确,您需要对顶层目录进行空检出,然后只对您想要的文件进行 'svn up',在此过程中设置深度。
例如,假设我有一个名为 'foo' 的顶层文件夹,它包含两个文件夹 'bar' 和 'zoog'。
/foo
  /bar
    -the files I want
  /zoog
    -the universe

目录'zoog'中有许多我暂时不关心的文件,但我想要能够使用'bar'。我会执行以下操作:

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

现在执行 'svn up' 命令会显示一切都是最新的,我可以在 'foo' 和 'bar' 中进行更改并提交它们,就像我也检出了 'zoog' 一样,但没有所有额外的开销。
('svn update' 命令中 '--set-depth' 的参数有 exclude、empty、files、immediates 和 infinity)。

我已经给你的答案点了个赞,因为它看起来可能是我需要的,但是为了运行命令行svn(而不是tortoise gui),我最终不得不升级SVN到1.7,这与v1.6有完全不同的元数据结构,所以我无法真正测试你的答案是否有效。 - wheresrhys
在第三步中,我调用了 svn up --set-depth infinity bar/folder1 命令,但是出现了错误 E155007 - Not a working copy。因此,我首先调用了 svn up --set-depth empty bar,然后再调用 svn up --set-depth infinity bar/folder1 - Bernhard Döbler

1

你很可能损坏或删除了每个检出中隐藏的 .svn 文件夹。

使用命令行在其他地方执行 svn co svn://your/svn/repository --depth immediates 并从那里恢复 .svn 文件夹。然后,您需要进行大量的 svn update .svn cleanup 序列以重新将子文件夹与父文件夹关联。


我已经尝试过了,但是检查立即执行似乎需要的时间和检查整个东西一样长 - 不知道为什么。这对我来说似乎非常反常。 - wheresrhys
1
然后尝试使用 svn co svn://your/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)由于子目录中的数据未受影响,因此不会再次下载。根目录中的数据将被重新获取。

0

首先备份您的完整工作副本。然后将您的工作副本更新到最新版本。您的最新版本具有根文件夹。SVN 将尝试再次写入该文件夹。然后会出现树冲突。然后运行清理并再次提交。


我无法更新到最新版本,因为SVN无法将其识别为工作副本,也无法在该目录上运行任何SVN命令。 - wheresrhys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接