是否有可能只在Git和Mercurial中克隆一个分支(或来自给定的提交)?我的意思是,我想要克隆一个中央回购,但由于它很庞大,我只想获得它的一部分,并且仍能够回馈我的变化.可能吗?比如,我只想从Tag 130开始或类似的东西?
如果是这样,怎么样?
在Git土地中,您正在谈论三种不同类型的部分克隆:
浅克隆:我想要从修订点X开始的历史.
使用git clone --depth
了这一点,但请记住浅克隆与其他信息库交互比较有限.您将能够生成补丁并通过电子邮件发送.
文件路径的部分克隆:我希望在某个目录中包含所有修订历史记录/path
.
在Git中不可能.使用现代Git,虽然你可以有稀疏结账,即你有完整的历史,但你检查(有工作区)只有所有文件的子集.
仅克隆选定的分支:我想只克隆一个分支(或选定的分支子集).
可能的,和
git的1.7.10之前并不简单:你需要做什么克隆手动做,即git init [
,然后git remote add origin
,编辑.git/config
替换*
在remote.origin.fetch
所要求的分支(可能是"主"),然后git fetch
.
从git 1.7.10开始 git clone
提供的--single-branch
选项似乎只是为了这个目的而添加,看起来很简单.
但请注意,由于分支通常共享其大部分历史记录,因此克隆仅一部分分支的收益可能比您想象的要小.
您还可以仅对选定的分支子集进行浅层克隆.
如果你知道人们会怎样想通过文件路径(多个项目在同一仓库)打破下来的东西,你可以使用子模块(有点像SVN:外部组件)预拆分成回购分别可复制的部分.
在mercurial土地,你谈论三种不同类型的部分克隆:
浅克隆:我希望从修订点X开始的历史记录使用remotefilelog扩展名
文件路径的部分克隆:我希望目录/路径中的所有修订历史记录具有实验性的narrowhg扩展名,或者我只希望目录/路径中的文件位于我的工作目录中,具有实验稀疏扩展(从4.3版本开始,请参阅参考资料hg help sparse
).
分支部分克隆:我希望分支Y上的所有修订历史记录:使用clone -r
如果您知道人们希望如何通过文件路径解决问题(同一个仓库中的多个项目(羞辱你)),您可以使用子存储库(类似于svn externals)将repo预拆分为可单独克隆的部分
此外,至于"如此巨大,我只想得到它的一部分":你真的只需要这样做一次.只是在你吃午饭时克隆它,然后你永远拥有它.随后你可以pull
有效地继续前进.如果你想要它的另一个克隆,只需克隆你的第一个克隆.你得到克隆的地方并不重要(本地克隆不占用额外的磁盘空间,因为它们是封面下的硬链接).
所选答案提供了一个很好的概述,但缺乏一个完整的例子.
最大限度地减少下载和结帐的足迹 (a), (b):
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处理大型存储库
此方法创建没有子存储库的无版本存档:
hg clone -U ssh://machine//directory/path/to/repo/project projecttemp cd projecttemp hg archive -r tip ../project-no-subrepos
没有子存储库的无版本源代码位于project-no-subrepos目录中