从远程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 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月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/master
和refs/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 origin “ url-of-repository ”
3) git fetch origin [这不会将你的文件移动到你的本地工作区,除非你合并]
4) git cherry-pick “ Enter-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