我想git克隆一个svn存储库,除了svn的根文件夹中的一个文件夹。
我该怎么做?
我可以做git svn clone svnrepo/dir/sb-dir/
如果我只需要sb-dir
,但我需要的内的所有文件夹(文件) dir
除了design
文件夹
如果您使用的是最新的Git1.7.0 ,它提供了稀疏的结账功能。
“稀疏结账”功能仅允许检出部分工作树。
请参阅Git Sparse Checkout SO问题 :您仍然需要克隆所有仓库,但是您可以仅使用部分克隆仓库结账(即填充您的工作树)
唯一的另一种方法是将design
转换为子模块。
正如GitPro书中提到的 :
Git的子模块支持允许存储库作为子目录包含外部项目的签出。
子模块保持自己的身份; 子模块支持只存储子模块存储库位置和提交ID,因此克隆包含项目的其他开发人员(“超级项目”)可以轻松克隆同一版本的所有子模块。
可以对超级项目进行部分检查:您可以告诉Git克隆无,部分或全部子模块。
子模块是我意识到实现“部分克隆”的唯一方法,因为在你的情况下,克隆部分是有问题的。
从你的评论:
我的问题是设计文件夹大约700 MB; git svn克隆需要几个小时。 整个项目的其余部分放在一起是10s的mb。
但这意味着修改SVN repo,将design
隔离为“外部”引用,然后git svn clone
并在克隆的Git repo中添加一个子模块引用。
您可以使用--ignore-paths=<regex>
选项来git svn init
或git svn fetch
,或者将配置选项svn-remote.<name>.ignore-paths
到.git/config
。 这被记录为“这允许人们指定一个Perl正则表达式,该表达式将导致从SVN的checkout跳过所有匹配路径。” 有关详细信息,请在手册中搜索“ignore-paths”。
在本回答中尝试实验后,我了解到正则表达式似乎应用于存储库根目录中每个目录或文件的完整路径。 因此,如果你有一个标准的存储库布局,并希望从每个trunk / branch / tag中排除相同的东西,你可以使用像^(trunk|((branches|tags)/[^/]+))/(<file-to-ignore>|<other-file-to-ignore>)(/|$)
这样的正则表达式^(trunk|((branches|tags)/[^/]+))/(<file-to-ignore>|<other-file-to-ignore>)(/|$)
。