如果没有在存储库中完成svn副本是否便宜?

时间:2009-01-19 01:00:55

标签: svn

如果我使用两个网址进行svn复制,我会在存储库中获得一个“廉价”副本...

svn copy http://repo_url/trunk http://repo_url/tags/release_foo

但是如果在工作目录中复制然后像这样提交它会怎样......

svn copy trunk tags/release_foo
svn commit tags/release_foo

该副本创建自动添加svn的文件的本地副本。它们只在提交时进入存储库。

doco中的示例似乎总是使用url来进行标记或分支的url复制,但我找不到任何明确说明你不应该使用WC到WC后跟提交的内容。

这两种方法一样吗?两者都在存储库中创建廉价副本吗?

3 个答案:

答案 0 :(得分:5)

当你在本地进行复制时,你当然会因复制本地机器上的文件而产生空间和时间成本(你的本地文件系统不知道SVN增量),但是当你去提交时,你应该看到只有复制的目录结构的根被列为已添加(带历史记录)。因此,当您提交时,它将在服务器上创建“廉价”副本。

也就是说,URL复制方法通常是分支或标记的首选方法,因为它不需要您检查存储库根目录(包括所有分支和标记 - 这将是巨大的!)。正常的用例是分支/标记服务器端(使用URL副本),然后根据需要检查分支/标签。

如果您只是出于某种原因复制工作副本中的文件或文件夹(比如说您将一个类文件分成两个并且希望保留公共历史记录),那么只需使用svn copy即可你的厕所。

答案 1 :(得分:4)

我认为,当涉及到“廉价”时,网址副本和WC副本几乎是一样的。在您的WC中,所做的任何副本都不是复制文件系统上的文件。

svn非常聪明,因为它基本上会创建一些从原点到新标签,分支或其他任何内容的软链接。

答案 2 :(得分:1)

不要这样做:

svn merge <local copy>/branch <local copy>/trunk

这样的命令可能同样麻烦:

svn copy trunk tags/release_foo
svn commit tags/release_foo

虽然在本地工作副本中复制很好,但是这些命令使得您看起来已经将整个存储库检出到一个工作副本中。我有人这样做,我们最终不得不删除主干并从之前的版本中复制它。不可思议的是,我不记得将我们装入那个角落的细节。我确实记得,当你尝试在“本地”目录上的分支之间进行合并时,事情会很快发生。

始终使用存储库URL来创建/管理/合并标记和分支。它更安全。它保证您的工作副本不会过时创建标记/分支,并保证创建是事务性的。

我认为问题可能是这样的:

  1. 人员A更新他们的一切工作副本
  2. Person A制作了一些标签,做了一些分支,做了一些合并,但还没有提交。
  3. 人员B对这些标签的来源或合并的分支进行一些更改。
  4. 人A试图提交,而svn不会让他们。
  5. 这是几年前的事情,所以我不记得具体细节,但是没有充分的理由将你的工作副本设置为这样。