示例:
$ svn copy foo.txt bar.txt
A bar.txt
<foo.txt>
的副本,同时保留与<bar.txt>
共享的历史记录? <bar.txt>
,<foo.txt>
会发生什么? 在其他现代系统(Clearcase,Accurev,Perforce)中,这有什么相同之处?
让我强调我正在寻找的观点:
这种分支是在文件级别吗?
如果您在同一分支中使用它会发生什么,即创建文件的副本而不是开始更改该新文件。所有人都在同一个分支?
我知道它也用于标记,但有趣的是我在文件级别执行<svn copy>
时会发生什么。
答案 0 :(得分:37)
除了分支/标记之外,您还可以在将文件拆分为两个时使用它。在这种情况下,两个新文件都将具有历史记录,您将能够在拆分之前查看代码。
BTW:这是SVN的少数功能之一,但Git没有(Git会尝试在事后猜测代码的来源,特别是如果你向命令添加-C
)。
答案 1 :(得分:23)
你什么时候使用这种技术?为什么?
创建标签以及创建分支,尽管通常您在目录而不是单个文件上使用它。标记是一个或多个文件的副本,为方便起见而保留但永远不会再更改。分支是一个或多个文件的副本,然后与原始文件分开演变
此命令是否会创建
foo.txt
的副本,同时保留与bar.txt
共享的历史记录?
不完全,foo.txt
的历史记录将被有效地复制到bar.txt
的历史记录中,然后在bar.txt
的历史记录中显示一个额外的条目,表明它是从{{{}}复制的1}},然后它们是独立的。因此,直到副本的历史是相同/共享的。
如果我正在更改
foo.txt
,bar.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.txt
(myBranch
中的myBranchForCopy
,或者{{1} }})。没有真正的“副本”,它是相同的元素。任何合并都将在:
foo.txt@@/main/myBranch/myBranchForCopy/LATEST
foo.txt@@/main/myBranch/LATEST
答案 6 :(得分:1)