在不重新下载的情况下更改现有SVN工作副本的深度

39

我有整个 SVN 仓库的工作副本,但由于磁盘空间问题,我想将其更改为稀疏工作副本。

其中一种方法是:

svn up --set-depth immediates projects
svn up --set-depth infinity projects/project1
svn up --set-depth infinity projects/project2

然而,这样做会首先删除project1project2,然后重新下载它们。这非常不方便,因为它们非常大,而且服务器的上传速度非常低。我尝试过这种方法(使用存储库的另一部分进行实验):

svn up --set-depth infinity projects/project1
svn up --set-depth infinity projects/project2
svn up --set-depth immediates projects

但是最后一个命令只是撤销了前两个命令的效果。

我如何设置工作副本的深度,而不会立即更新/更改它,以便我有机会正确配置子目录?

或者是否有其他方法可以实现我的目标,例如首先将project1project2复制到安全位置?

5个回答

32

哇,我曾经遇到过这个问题,而 TortoiseSVN 支持在稀疏检出中添加和删除项目的解决方案。

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

1. 添加: 在 Windows 资源管理器上,右键单击已检出的文件夹,然后使用 TortoiseSVN ? 仓库浏览器打开仓库浏览器。查找您想要添加到工作副本的子文件夹,然后使用上下文菜单 ? 更新到修订版本...。

2. 删除: 从根目录开始,在右键单击 / Repo-Browser / 更新到修订版本;然后选择“排除”。


13
你不需要通过仓库浏览器来操作。TortoiseSVN的上下文菜单中有“更新到修订版本...”选项。只需右键单击排除的文件夹本身,而不是工作目录根目录。当然,这假定你的路径中存在一个存根文件夹(空的排除文件夹)。 - dobbs

3
我最终进行了破解:
  • 手动将深度设置为“immediates”以便于projects *。
  • 硬删除(不是SVN删除)除project1project2以外的projects下的所有子项。
  • svn up projects

[*] 要执行此操作,请在文本编辑器中打开projects/.svn/entries并更改。

b125e325-6f7c-4931-9942-d1ea1ea1441a
X

转换成

b125e325-6f7c-4931-9942-d1ea1ea1441a







immediates
X

注意: 那个看起来像UUID的行在每个仓库中可能是不同的,而X实际上是十六进制值0x0C,我无法在SO上显示它。


1

我遇到了同样的问题,但你所写的在 SVN 1.7 中似乎不可能,因为元数据格式看起来不同。

这是我最终所做的(使用你那种情况中的目录)。首先,我把project1project2复制到安全的位置。

svn co --depth immediates svn_url/projects 

这个命令检查带有空目录的project1project2项目。然后我删除了这些空文件夹,并将实际的目录放在它们的位置上。SVN给了我一些奇怪的消息,但似乎可以工作并允许我提交。(使用--depth empty不起作用,然后再复制文件夹进去,但是immediates似乎可以工作。)

我同意这种情况并不理想,但这就是为什么我将来的项目都会转向Git!我已经使用SVN很长时间了,但现在已经无法满足需求。


1

没有什么比重新提出一个旧的SO问题更好的了。

我一直在处理一个非常类似的问题,即从主干分支创建一个发布包,但由于限制,我必须克隆仅用于开发的文件。

asset
└── js
    └── some
        └── directories
            ├── assets
            │   ├── files ...
            ├── dev       **<------------ This folder needs to be empty**
            │   ├── apis
            │   ├── campaign
            │   ├── features
            │   ├── modules
            │   ├── main.js
            │   └── tags
            └── release
                ├── apis
                ├── data
                ├── features
                ├── modules
                ├── main.js
                └── tags

我决定排除dev文件,以消除在错误目录中修补发布分支的诱惑。 我做了很多稀疏检出,以避免主干中的大型文件夹,但从未在工作副本上回顾地完成过。 这似乎非常简单。 要修改工作副本,使asset/js/some/directories/dev为空,只需在工作副本上再次运行svn co命令即可。 在我的情况下,以下命令有效。
svn co --depth empty ^/branches/releases/latest/asset/js/some/directories/dev \
asset/js/some/directories/dev

您基本上是在现有的工作副本上运行部分检出,这将在任何级别上都起作用。在原始情况下,您只需运行以下命令。
svn co --depth immediates ^/branches/mybranch/projects projects
svn co --depth immediates ^/branches/mybranch/project1 project1
svn co --depth immediates ^/branches/mybranch/project2 project2

对于不了解插入符号^的人来说,它是仓库根目录的速记符号,因此它像在存储库中的相对路径一样工作,有点像../some/location
关键在于您不需要创建新的工作副本来解决问题。您可以在现有的工作副本上运行这些命令并重置所选目录的深度。

0

我不知道为什么其他答案中的人们要用困难的方式做事。

自从Subversion 1.6以来,只需简单地执行以下操作即可: svn update --set-depth exclude <directory_you_want_to_prune_from_local_working_copy>


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