从远程Git存储库中检索特定的提交

有没有办法从远程Git仓库中只检索一个特定的提交而无需将其克隆到我的PC上? 远程回购的结构与我的结构完全相同,因此不会有任何冲突,但我不知道如何执行此操作,我不想克隆这个庞大的存储库。

我对git很陌生,有什么办法吗?


你只克隆一次,所以如果你已经有了一个远程仓库的克隆,那么从它上拉就不会再下载所有的东西。 只需说明你想要拉什么分支,或者获取更改并签出你想要的提交。

从新存储库获取带宽非常便宜,因为它只会下载您没有的更改。 以Git做出正确的事情,并以最小的负载考虑。

Git将所有内容存储在.git文件夹中。 提交不能被提取并孤立存储,它需要它的所有祖先。 它们是相互关联的。


然而,为了减少下载的大小,你可以让git只提取与特定分支或提交相关的对象:

git fetch origin refs/heads/branch:refs/remotes/origin/branch

这将只下载包含在远程分支branch提交(只有你错过的提交 ,并将其存储在origin/branch 。 然后您可以合并或结帐。

您也可以只指定一个SHA1提交:

git fetch origin 96de5297df870:refs/remotes/origin/foo-commit

这将只下载指定SHA-1 96de5297df870(及其未命中的祖先)的提交,并将其存储为(不存在的)远程分支origin/foo-commit


使用Git 2.5+(2015年第二季度),获取单个提交(无需克隆完整的回购)实际上是可能的!

Fredrik Medley( moroten )于2015年5月21日发布的承诺68ee628。
(由Junio C gitster合并 - gitster - 于2015年6月1日提交a9d3493)

你现在有一个新的配置(在服务器端)

uploadpack.allowReachableSHA1InWant

允许upload-pack接受一个获取请求,要求获取任何参考提示可访问的对象。 但是,请注意,计算对象可达性的计算成本很高。
默认为false

使用浅克隆( git fetch --depth=1 )的组合,您现在可以请求单个提交(请参阅t/t5516-fetch-push.sh

git fetch --depth=1 ../testrepo/.git $SHA1
git cat-file commit $SHA1

提供服务“ git fetch ”的“ git upload-pack ”可以被告知提交那些不在任何ref的提交,只要它们可以从ref中获得,并带有uploadpack.allowReachableSHA1InWant配置变量。


完整的文档是:

upload-pack :可选地允许获取可达的sha1

通过在服务器端设置uploadpack.allowReachableSHA1InWant配置选项,“ git fetch ”可以发出一个请求,其中包含一个名为未公布的对象的“需要”行(可能是通过带外或子模块指针获取的) 。
只有从分支提示中可以访问的对象(即,由transfer.hideRefs隐藏的广告分支和分支的联合)将被处理。
请注意,不得不走回历史记录来检查可达性。

当获取sha1已知的某个提交的内容时,可以使用此功能,而不需要克隆整个存储库,尤其是在使用浅层提取时

有用的例子是例如

  • 包含历史中大文件的存储库,
  • 只提取子模块结帐所需的数据,
  • 当分享一个sha1而不告诉它属于哪个确切的分支时,并且在Gerrit中,如果你认为是以提交而不是改变数字。
    (Gerrit的案例已经通过allowTipSHA1InWant解决了,因为每个Gerrit变更都有参考。)

  • Git 2.6(2015年第3季度)将改进该模型。
    见Jeff King( peff )的commit 2bc31d1,commit cc118a6(2015年7月28日)。
    (合并由Junio C gitster - gitster - 在承诺824a0be,2015年8月19日)

    refs :支持 transfer.hideRefs

    如果使用transfer.hideRefs配置隐藏参考层次,则无法稍后重写该配置以“取消隐藏”它。
    这个补丁实现了一个“负面”的隐藏,这会导致匹配立即被标记为未隐藏,即使另一个匹配会隐藏它。
    我们注意以相反的顺序应用匹配,从配置机器给我们的方式,因为这可以让我们通常的“最后一个获胜”配置优先工作(例如,在.git/config条目将覆盖/etc/gitconfig )。

    所以你现在可以做到:

    git config --system transfer.hideRefs refs/secret
    git config transfer.hideRefs '!refs/secret/not-so-secret'
    

    隐藏所有回购协议中的refs/secret ,除了一个特定回购中的一个公开位。


    Git 2.7(2015年11月/ 12月)将再次改善:

    请参见提交948bfa2,提交00b293e(2015年11月5日),提交78a766a,提交92cab49,提交92cab49,提交92cab49(2015年11月3日),提交00b293e,提交00b293e(2015年11月05日)由Lukas Fleischer( lfos )提交92cab49(2015年11月3日)。
    帮助:埃里克阳光( sunshineco )。
    (由Jeff King合并 - peff - 在提交dbba85e,2015年11月20日)

    config.txt :用命名空间记录hideRefs的语义

    目前,没有关于如何设置名称空间时transfer.hideRefs应该如何表现的明确定义。
    在这种情况下解释hideRefs前缀匹配剥离的名称。 这是hideRefs模式当前如何在接收包中处理的。

    hideRefs:添加对匹配完整引用的支持

    除了匹配剥离参考,现在可以添加完整(未剥离)参考匹配的hideRefs模式。
    为了区分剥夺和完全匹配,这些新模式必须以旋律( ^ )作为前缀。

    因此新的文档:

    transfer.hideRefs:
    

    如果正在使用命名空间,则在与transfer.hiderefs模式匹配之前,命名空间前缀会从每个引用中剥离。
    例如,如果在transfer.hideRefs指定了refs/heads/master并且当前命名空间为foo ,则从广告中省略refs/namespaces/foo/refs/heads/master ,但是refs/heads/masterrefs/namespaces/bar/refs/heads/master仍然被称为所谓的“有”线。
    为了在剥离前匹配ref,在ref名称前添加^ 。 如果你结合起来!^ ! 必须先指定。


    我做了一个拉我的git回购:

    git pull --rebase <repo> <branch>
    

    允许git提取分支的所有代码,然后我重置了对我感兴趣的提交。

    git reset --hard <commit-hash>

    希望这可以帮助。

    链接地址: http://www.djcxy.com/p/90447.html

    上一篇: Retrieve specific commit from a remote Git repository

    下一篇: How to convert a Git shallow clone to a full clone?