从远程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已知的某个提交的内容时,可以使用此功能,而不需要克隆整个存储库,尤其是在使用浅层提取时 。
有用的例子是例如
(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/master
和refs/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