部分克隆与Git和Mercurial

是否有可能在Git和Mercurial中只克隆一个分支(或从一个给定的提交)? 我的意思是,我想克隆一个中央回购,但因为它是巨大的,我只想得到它的一部分,仍然能够回馈我的变化。 可能吗? 就像,我只想从标签130或类似的东西?

如果是这样,怎么样?

在Git的土地上,你正在谈论三种不同types的部分克隆:

  • 浅层克隆:我想从修订点X开始的历史。

    使用git clone --depth <n> <url> ,但请记住浅层克隆在与其他存储库交互时有一定的局限性。 您将能够生成补丁并通过电子邮件发送。

  • 通过filepath进行部分克隆:我想要在某个目录/path所有修订历史logging。

    在Git中不可能 。 与现代的Git,虽然你可以有稀疏结帐 ,即你有完整的历史,但你退房(在工作区)只有所有文件的子集。

  • 克隆只有选定的分支:我想克隆只有一个分支(或选定的分支子集)。

    可能的,和

    在git 1.7.10之前不是简单的:你需要做的是手工克隆,即git init [<directory>] ,然后git remote add origin <url> ,在remote.origin.fetch编辑.git/configreplace*请求的分支(可能是“主”),然后git fetch

    从git 1.7.10开始, git clone提供了--single-branch选项,它似乎是为了这个目的而添加的,而且看起来相当简单。

    但请注意,由于分支机构通常分享他们大部分的历史,因此只克隆分支子集的收益可能会比您想象的要小。

您也可以对选定的分支子集进行浅层克隆。

如果你知道人们希望通过filepath(同一个存储库中的多个项目)来分解东西,你可以使用子模块(有点像svn:externals)将repo预分割成单独的可复制部分。

在mercurial的土地上,你正在谈论三种不同types的部分克隆:

  • 浅层克隆:我想从修订点X开始的历史使用remotefilelog扩展
  • 文件path的部分克隆:我想在实验narrowhg扩展目录/path中的所有修订历史logging,或者我只想在目录/path中的文件在我的工作目录实验性稀疏扩展 (自4.3版本发货,请参阅hg help sparse )。
  • 分支部分克隆:我想要分支Y上的所有修订历史logging: 使用克隆-r

如果你知道人们希望通过filepath(同一个仓库中的多个项目)来分解东西,你可以使用subrepositories(有点像svn externals)来预先将repo分成独立的可复制部分

另外,对于“这么庞大,我只想得到它的一部分”:你真的只需要这样做一次。 当你吃午饭的时候克隆它,然后你永远拥有它。 随后,您可以pull并有效地向前迈进三angular洲。 如果你想要另一个克隆,只需克隆你的第一个克隆。 在哪里得到一个克隆并不重要(本地克隆不占用额外的磁盘空间,因为它们是硬链接)。

这种方法创build一个没有版本库的未版本化的归档文件:

 hg clone -U ssh://machine//directory/path/to/repo/project projecttemp cd projecttemp hg archive -r tip ../project-no-subrepos 

没有子版本的未版本化的源代码在project-no-subrepos目录下

所选的答案提供了一个很好的概述,但没有一个完整的例子。

(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处理大版本库

关于Git,Linus Torvalds从概念的angular度回答了这个问题可能具有历史意义,这个问题早在2007年就已经被logging下来,并且可以在线获得。

问题是,是否有可能从Git仓库中只检出一些文件。

Tech Talk:Linus Torvalds on git t = 43:10

总之,他说Git的一个devise决定将其与其他源代码pipe理系统(他引用BitKeeper和SVN)区别开来,就是Gitpipe理内容,而不是文件。 其含义是,例如在两个版本中的文件的一个子集的差异是通过首先采取整个差异,然后修剪它只有被请求的文件来计算。 另一个是你必须检查整个历史; 以全有或全无的方式。 出于这个原因,他build议在多个存储库之间拆分松散相关的组件,并且提到当时正在努力实现用于pipe理作为超级项目的存储库的用户界面,该存储库容纳较小的存储库。

据我所知这个基本的devise决定今天仍然苹果。 超级项目的东西可能成了现在的子模块 。

在mercurial,你应该能够这样做一些使用:

 hg convert --banchmap FILE SOURCEDEST REVMAP 

您可能还想要:

 --config convert.hg.startrev=REV 

源可以是git,mercurial或其他各种系统。

我没有尝试过,但转换是相当丰富的。