svn copy的用途是什么?

时间:2008-12-02 23:06:22

标签: svn version-control

示例:

$ svn copy foo.txt bar.txt  
A    bar.txt
  • 你什么时候使用这种技术?为什么?
  • 此命令(取自svn的“红皮书”)是否会创建<foo.txt>的副本,同时保留与<bar.txt>共享的历史记录?
  • 如果我正在更改<bar.txt><foo.txt>会发生什么?

在其他现代系统(Clearcase,Accurev,Perforce)中,这有什么相同之处?

让我强调我正在寻找的观点:
这种分支是在文件级别吗? 如果您在同一分支中使用它会发生什么,即创建文件的副本而不是开始更改该新文件。所有人都在同一个分支? 我知道它也用于标记,但有趣的是我在文件级别执行<svn copy>时会发生什么。

7 个答案:

答案 0 :(得分:37)

除了分支/标记之外,您还可以在将文件拆分为两个时使用它。在这种情况下,两个新文件都将具有历史记录,您将能够在拆分之前查看代码。

BTW:这是SVN的少数功能之一,但Git没有(Git会尝试在事后猜测代码的来源,特别是如果你向命令添加-C)。

答案 1 :(得分:23)

  

你什么时候使用这种技术?为什么?

创建标签以及创建分支,尽管通常您在目录而不是单个文件上使用它。标记是一个或多个文件的副本,为方便起见而保留但永远不会再更改。分支是一个或多个文件的副本,然后与原始文件分开演变

  

此命令是否会创建foo.txt的副本,同时保留与bar.txt共享的历史记录?

不完全,foo.txt的历史记录将被有效地复制到bar.txt的历史记录中,然后在bar.txt的历史记录中显示一个额外的条目,表明它是从{{{}}复制的1}},然后它们是独立的。因此,直到副本的历史是相同/共享的。

  

如果我正在更改foo.txtbar.txt会发生什么?

没什么,它们是完全分开的。但是您可以稍后将更改从一个更改为另一个。

答案 2 :(得分:10)

这是一个稍微不寻常的用法,但我发现有时我必须将源文件分成两个单独的文件 - 例如,如果它包含两组不相关的功能,我使用svn copy来执行此操作。然后我修改两个文件并从每个文件中删除不适当的位。这样,两个新文件都保留了相关位的修订历史记录。

答案 3 :(得分:8)

  

这有什么相同之处   其他现代系统(Clearcase,   Accurev,Perforce)?

git会注意到普通副本上的文件是相同的,并将其显示为副本。

答案 4 :(得分:1)

我在创建新文件时使用此技术,并且我想复制脚手架(我目前使用Perforce,但过去常常使用Subversion)。更改副本不会影响其他文件。

答案 5 :(得分:1)

Branch不是Subversion中的一等公民,因为它被“实现”为目录。

因此,svn copy允许在同一分支(目录)内的文件分支。您可以稍后将复制的文件合并回第一个文件。但这不适合只有一个文件,如this thread

中所提到的那样

ClearCase中的等价物将是一个选择规则,如

element * .../myBranchForCopy/LATEST
element /myPath/myFile /main/myBranch/LATEST -mkbranch myBranchForCopy

但是,在用于分支文件的此视图中,您一次只能看到一个foo.txtmyBranch中的myBranchForCopy,或者{{1} }})。没有真正的“副本”,它是相同的元素。任何合并都将在:

之间
  • foo.txt@@/main/myBranch/myBranchForCopy/LATEST
  • foo.txt@@/main/myBranch/LATEST

答案 6 :(得分:1)

在我无意中删除了一个文件后,

svn copy派上了用场。请参阅anwer以了解我提出的question