是否可以在Git和Mercurial中仅克隆一个分支(或从给定提交中克隆)?我的意思是,我想克隆一个中央存储库,但是由于存储库很大,所以我只希望得到其中的一部分,并且仍然能够回馈我的更改。可能吗?就像,我只想要Tag 130或类似的东西?
如果是这样,怎么办?
Answers:
在Git领域中,您正在谈论三种不同类型的部分克隆:
浅表克隆:我想要从修订点X开始的历史记录。
使用git clone --depth <n> <url>
了这一点,但请记住浅克隆与其他信息库交互比较有限。您将能够生成补丁并通过电子邮件发送它们。
按文件路径部分克隆:我希望所有修订历史记录都在某个目录中/path
。
在Git中是不可能的。使用现代Git,虽然您可以进行稀疏签出,即您拥有完整的历史记录,但是仅签出(位于工作区中)所有文件的子集。
仅克隆选定的分支:我只想克隆一个分支(或选定的分支子集)。
可能的,并且
以前的git 1.7.10并不简单:你需要做什么克隆手动做,即git init [<directory>]
,然后git remote add origin <url>
,编辑.git/config
替换*
在remote.origin.fetch
所要求的分支(可能是“主”),然后git fetch
。
从git 1.7.10版本开始, git clone
提供的--single-branch
选项似乎是为此目的而添加的,并且看起来非常简单。
但是请注意,由于分支通常共享大部分历史记录,因此仅克隆分支的子集所获得的收益可能会比您想象的要小。
您也可以仅对选定的分支子集进行浅表克隆。
如果您知道人们将如何按文件路径(同一存储库中的多个项目)分解内容,则可以使用子模块(类似于svn:externals)将存储库预分割为可单独克隆的部分。
在商业领域,您正在谈论三种不同类型的部分克隆:
hg help sparse
)。如果您知道人们将如何按文件路径分解内容(同一存储库中有多个项目(让您感到羞耻)),则可以使用子存储库(类似于svn外部组件)将存储库预先拆分为可单独克隆的部分
另外,关于“我只想参与其中的一部分”:您真的只需要做一次。只需在午餐时克隆它,然后再永久食用即可。随后,您可以pull
有效地获得增量。如果您想要它的另一个克隆,只需克隆您的第一个克隆。克隆的位置无关紧要(本地克隆不会占用额外的磁盘空间,因为它们是底层的硬链接)。
sparse.py
Facebook的Mercurial扩展名-bitbucket.org/facebook/hg-experimental进行。
选定的答案提供了很好的概述,但缺少完整的示例。
git clone --no-checkout --depth 1 --single-branch --branch (name) (repo) (folder)
cd (folder)
git config core.sparseCheckout true
echo "target/path/1" >>.git/info/sparse-checkout
echo "target/path/2" >>.git/info/sparse-checkout
git checkout
定期优化您的本地存储库占用空间 (c) (可选,请谨慎使用):
git clean --dry-run # consider and tweak results then switch to --force
git gc
git repack -Ad
git prune
另请参阅:如何使用git处理大型存储库
关于Git,Linus Torvalds在2007年的一次演讲中从概念的角度回答了这个问题,这可能具有历史意义,该演讲已录制并可以在线获得。
问题是,是否有可能仅从Git存储库中检出某些文件。
技术讲座:Linus Torvalds在git t = 43:10上
总而言之,他说,Git的设计决策之一使Git与其他源代码管理系统区分开(他引用BitKeeper和SVN),这是Git管理内容而不是文件。其含义是,例如,通过首先获取整个差异然后仅将其修剪到所请求的文件来计算两个修订版中文件子集的差异。另一个是您必须查看整个历史记录。以全有或全无的方式。由于这个原因,他建议在多个存储库之间拆分松散相关的组件,并提到随后正在进行的工作,以实现用于管理存储库的用户界面,该用户界面被构造为拥有较小存储库的超级项目。
据我所知,这个基本的设计决策今天仍然很重要。超级项目的事情可能变成了现在的子模块。