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