在SVN中,如何仅将目录的子目录复制到另一个目录?

时间:2008-11-04 02:42:27

标签: svn copy

通过命令行,我通常这样做:

cp -rRp /path/to/a\_folder/. /path/to/another\_folder

这会将 a_folder 下的内容复制到 another_folder 。在SVN我需要做同样的事情,但无法搞清楚。我总是最终得到这个:

/path/to/another\_folder/a\_folder

即使我尝试这样做,SVN也会抛出:

svn copy file:///path/to/a\_folder/* file:///path/to/another\_folder

它说它不存在。

修改

这可能会有所帮助。我的项目的目录结构如下所示:

my_project
  /branches
  /tags
  /trunk
  /vendor
    /1.1

我需要将供应商下的1.1内容放入主干,而不是实际复制1.1文件夹。

5 个答案:

答案 0 :(得分:20)

正如您所发现的那样,复制到已存在的目标目录将无效:

svn cp svn://my_project/vendor/1.1 svn://my_project/trunk

因为trunk已经存在,所以你最终得到:

svn://my_project/trunk/1.1

使用 merge 有一个不幸的特性,就是在引入合并跟踪的1.5之前的subversion中不保留vendor 1.1标记的历史记录。你可能不在乎。在这种情况下,合并将是正确的解决方案:

svn co svn://my_project/trunk trunk-wc
svn merge svn://my_project/trunk svn://my_project/vendor/1.1 trunk-wc

阅读此合并的最佳方法是:首先确定使trunkvendor/1.1相同所需的更改,然后将这些更改应用于给定的工作副本(在这种情况下也适用于主干) )。

我应该指出,这次合并将有效地吹走之前在行李箱中的任何东西。因此,如果您已经在主干上进行了本地(非供应商)修改,那么您只需要应用1.1和之前供应商代码之间的更改:

svn co svn://my_project/trunk trunk-wc
svn merge svn://my_project/vendor/1.0 svn://my_prjoect/vendor/1.1 trunk-wc

如果 trunk存在但是为空,你有两个选择:替换trunk,或写一个小shell循环:

更换主干如下所示:

svn rm svn://my_project/trunk
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk

利用shell (bash):

svn co svn://my_project/trunk trunk
svn co svn://my_project/vendor/1.1 1.1
( cd 1.1
  for x in * ; do
    svn cp $x ../trunk
  done 
)
svn ci trunk

答案 1 :(得分:9)

你考虑过使用svn merge吗?

鉴于这样的回购:

trunk/a_folder/foo
trunk/a_folder/bar
trunk/new_folder/baz

使用这些命令合并foo和bar目录:

cd trunk/new_folder
svn merge -r1:HEAD http://svn/repo/trunk/a_folder .

答案 2 :(得分:6)

此链接解释了一种解决方法。

http://svn.haxx.se/users/archive-2004-12/1537.shtml

基本上它说的是如果目标文件夹不存在于仓库中,您将获得目标文件夹中源文件夹的内容。

见下面的例子。您的仓库中不存在07-03-2012文件夹。执行以下命令后,您将在07-03-2012获取HEAD文件夹的内容。

svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test"

答案 3 :(得分:3)

我认为你想要的是主干的内容最终会出现在/tags/version-1.0/文件夹中而没有额外的/trunk文件夹。即这很糟糕:/tags/version-1.0/trunk/stuff。这很好:/tags/version-1.0/stuff

为了做到这一点,我做了两个步骤:

svn copy http://localhost/MyProject/trunk    http://localhost/MyProject/tags/

# now I have /MyProject/tags/trunk

svn rename http://localhost/MyProject/tags/trunk  http://localhost/MyProject/tags/version-1.0

答案 4 :(得分:1)

你非常非常接近:

svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder

从第一个参数中删除/*