7

由于某种原因,我的 SVN 存储库的本地副本停止将父目录识别为工作副本。我通常会通过再次签出另一个文件夹并用我更改的文件覆盖新的工作副本来解决这个问题。然后我会从新文件夹中进行提交。

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

问题是 SVN 知道我只检查了几个文件。有没有办法可以伪造它并让 SVN 认为我刚刚完成了完整的结帐?(例如,一种我可以只获取 .svn 文件夹以进行完整结帐而不实际检查所有内容的方法)

4

4 回答 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、immediate 和 infinity)

于 2011-10-25T16:08:26.373 回答
1

.svn您很可能在每次结帐时都损坏或删除了隐藏文件夹。

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

于 2011-10-03T16:27:50.980 回答
0

如果只有工作副本的根目录被损坏并且大(或许多文件)位于工作副本根目录下的目录中,则以下过程应该可以工作,而无需再次从 repo 下载文件:

> # 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) 由于子目录中的数据没有被修改,因此不会再次下载。将再次获取根目录中的数据。
于 2011-10-24T18:11:28.547 回答
0

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

于 2011-10-03T16:07:03.857 回答