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

有没有办法从远程Git仓库中只检索一个特定的提交而无需将其克隆到我的PC上? 远程回购的结构和我的完全一样,因此不会有任何冲突,但我不知道该怎么做,我也不想克隆这个庞大的仓库。

我是新来的混帐,有什么办法吗?

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

从新存储库获取带宽非常便宜,因为它只会下载您没有的更改。 以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 – in commit a9d3493 ,2015年6月1日)

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

 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年第三季度)将会改进这个模型。
见Jeff King( peff )的 commit 2bc31d1 , commit cc118a6 (2015年7月28日) 。
(由Junio C gitstergitster -在承诺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月5日)由Lukas Fleischer( lfos ) 提交92cab49 (2015年11月3日) 。
帮助: 埃里克阳光( sunshineco ) 。
(由Jeff King合并- peff – in 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>

希望这可以帮助。

你可以简单地用一个远程仓库提交一个提交

 git fetch <repo> <commit> 

哪里,

  • <repo>可以是一个远程回购的名称(例如origin ),甚至远程回购网址(例如https://git.foo.com/myrepo.git
  • <commit>可以是SHA1提交

例如

 git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545 

提取提交后(和失去的祖先),你可以简单地检查它

 git checkout FETCH_HEAD 

请注意,这会使您处于“分离头部”状态。

您可以简单地获取远程回购:

 git fetch <repo> 

哪里,

  • <repo>可以是一个远程回购的名称(例如origin ),甚至远程回购网址(例如https://git.foo.com/myrepo.git

例如:

 git fetch https://git.foo.com/myrepo.git 

在获取回购站之后,您可以合并您想要的提交(因为问题是关于检索一个提交,而不是合并,您可以使用cherry-pick来选择一个提交):

 git merge <commit> 
  • <commit>可以是SHA1提交

例如:

 git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545 

要么

 git merge 0a071603d87e0b89738599c160583a19a6d95545 

如果是要合并的最新提交,那么也可以使用FETCH_HEAD变量:

 git cherry-pick (or merge) FETCH_HEAD 

最后我找到了一种使用git cherry-pick克隆特定提交的方法。 假设你在本地没有任何仓库,并且你正在从远程提交特定的提交,

1)在本地和git init中创建空的仓库

2) git remote add originurl-of-repository

3) git fetch origin [这不会将你的文件移动到你的本地工作区,除非你合并]

4) git cherry-pickEnter-long-commit-hash-that-you-need

完成。通过这种方式,您将只拥有本地特定提交的文件。

进入长提交哈希:

你可以使用 – > git log –pretty = oneline

我认为'git ls-remote'( http://git-scm.com/docs/git-ls-remote )应该做你想做的。 没有强制取或拉。

第1步:获取提交列表:

git日志

你会得到像这个例子中的列表:

提交7244ab27d1c3411cdb8c0111706a4f0cd1236ce1(提交哈希)作者:aspmac日期:Thu May 4 18:03:40 2017 +0530

 Fix header in ios(In-progress). 

这是最后一个提交消息

提交b586ed0f5fd6b89a73b632181774464ef1c37bd5(提交哈希)作者:作者日期:Wed May 3 11:44:28 2017 +0530

 remove all console. 

这是以前的提交消息

…第2步:复制需要提交的哈希,并将其粘贴进行结帐:

git checkout b586ed0f5fd6b89a73b632181774464ef1c37bd5

如果你喜欢这个,请把所有赞扬发给Sergio的帖子。 解决方法是在他的回答中提到的。 我认为这在拉任何回购任何提交的作品。

顺序如下:

 git init git fetch <repo> git merge <commitSHA> git push 

喜欢这个:

 git init git fetch https://github.com/github/octicons.git git merge 8fc17d58e75d9711fcd7f51a158f93ce9076cb23 git push