有没有办法只从远程Git仓库检索一个特定的提交而不在我的PC上克隆它?远程仓库的结构与我的结构完全相同,因此不会有任何冲突,但我不知道如何做到这一点,我不想克隆那个庞大的存储库.
我是git的新手,有什么办法吗?
Von*_*onC 103
从Git版本2.5+开始(2015年第2季度),实际上可以获取单个提交(不克隆完整的回购).
见提交68ee628由弗雷德里克混合泳(moroten),5月21日2015年
(由合并JUNIOÇ滨野- gitster-在提交a9d3493,2015年6月1日)
你现在有了一个新的配置(在服务器端)
uploadpack.allowReachableSHA1InWant
Run Code Online (Sandbox Code Playgroud)
允许
upload-pack接受获取请求,该请求请求可从任何ref tip访问的对象.但是,请注意,计算对象可达性在计算上是昂贵的.
默认为false.
如果将服务器端配置与浅克隆(git fetch --depth=1)结合使用,则可以请求单个提交(请参阅t/t5516-fetch-push.sh:
git fetch --depth=1 ../testrepo/.git $SHA1
Run Code Online (Sandbox Code Playgroud)
您可以使用该git cat-file命令查看是否已提取提交:
git cat-file commit $SHA1
Run Code Online (Sandbox Code Playgroud)
"
git upload-pack"服务"git fetch"可以被告知服务于不在任何引用的尖端的提交,只要它们可以从具有uploadpack.allowReachableSHA1InWant配置变量的ref到达.
完整的文档是:
upload-pack:可选择允许获取可到达的sha1通过
uploadpack.allowReachableSHA1InWant在服务器端设置配置选项,"git fetch"可以使用"want"行创建一个请求,该行命名一个尚未公布的对象(可能是在带外或从子模块指针获得的).
只处理从分支提示可到达的对象,即广告分支和隐藏的分支的并集transfer.hideRefs.
请注意,必须返回历史记录以检查可达性的相关成本.当获取sha1已知的特定提交的内容时,可以使用此功能,而无需克隆整个存储库,尤其是在使用浅提取时.
有用的例子是例如
- 包含历史记录中的大文件的存储库,
- 仅获取子模块结帐所需的数据,
- 当共享一个sha1而不告诉它属于哪个精确的分支时,如果你在提交而不是改变数字的情况下考虑.
(Gerrit案例已经解决,allowTipSHA1InWant因为每个Gerrit变更都有一个参考.)
Git 2.6(2015年第3季度)将改进该模型.
请参阅提交2bc31d1,提交cc118a6(2015年7月28日)作者:Jeff King(peff).
(由Junio C gitsterHamano合并- -在提交824a0be,2015年8月19日)
refs:支持否定transfer.hideRefs如果使用
transfer.hideRefs配置隐藏refs的层次结构,则无法稍后覆盖该配置以"取消隐藏"它.
这个补丁实现了一个"否定"隐藏,使得匹配立即被标记为未隐藏,即使另一个匹配会隐藏它.
我们注意以相反的顺序应用匹配顺序,从配置机制将它们传送给我们,因为这样可以让我们通常的"最后一个获胜"配置优先工作(.git/config例如,条目将覆盖/etc/gitconfig).所以你现在可以这样做:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
Run Code Online (Sandbox Code Playgroud)
隐藏
refs/secret在所有回购中,除了一个特定回购中的一个公共位.
Git 2.7(2015年11月/ 12月)将再次改善:
请参阅commit 948bfa2,commit 00b293e(2015年11月5日),commit 78a766a,commit 92cab49,commit 92cab49,commit 92cab49(2015年11月3日),commit 00b293e,commit 00b293e(2015年11月5日),并提交92cab49,commit 92cab49,commit 92cab49,由Lukas Fleischer()承诺92cab49(2015年11月3日).
帮助:Eric Sunshine().(由Jeff King合并- -在提交dbba85e,2015年11月20日)lfossunshineco
peff
config.txt:记录hideRefswith namespaces 的语义目前,没有明确的定义在
transfer.hideRefs设置命名空间时应该如何表现.在这种情况下,
解释hideRefs前缀匹配剥离的名称.这就是hideRefs当前在receive-pack中处理模式的方式.hideRefs:添加对匹配完整引用的支持
除了匹配剥离的引用之外,现在可以添加
hideRefs完整(未剥离)引用匹配的模式.
为区分剥离匹配和完全匹配,这些新模式必须以circumflex(^)作为前缀.
因此新的文件:
transfer.hideRefs:
Run Code Online (Sandbox Code Playgroud)
如果正在使用命名空间,则在与
transfer.hiderefs模式匹配之前,将从每个引用中剥离命名空间前缀.
例如,如果refs/heads/master在被指定transfer.hideRefs并且目前的命名空间foo,然后refs/namespaces/foo/refs/heads/master从广告省略,但refs/heads/master并refs/namespaces/bar/refs/heads/master仍然通告为所谓的"有"行.
为了在剥离之前匹配refs^,在ref名称前面添加一个.如果合并!和^,!必须先指定.
R .. 在注释中提到了配置uploadpack.allowAnySHA1InWant,它允许upload-pack接受任何fetch请求任何对象的请求.(默认为false).
请参阅David"novalis"Turner()提交f8edeaa(2016年11月,Git v2.11.1 ):novalis
upload-pack:可选择允许获取任何sha1在我们信任用户完全访问存储库中的所有内容的情况下,进行重新检查似乎有点愚蠢.
此外,它在分布式系统中很活跃 - 也许一个服务器通告一个ref,但是另一个服务器已经强制推送到该ref,并且可能两个HTTP请求最终被定向到这些不同的服务器.
Cha*_*esB 95
您只能克隆一次,因此如果您已经拥有远程存储库的克隆,则从中删除它将不会再次下载所有内容.只需指出要提取的分支,或者获取更改并签出所需的提交.
从新存储库中获取带宽非常便宜,因为它只会下载您没有的更改.考虑到Git以最小的负载做出正确的事情.
Git将所有内容存储在.git文件夹中 提交不能被孤立地提取和存储,它需要它的所有祖先.它们是相互关联的.
但是,为了减少下载大小,您可以要求git仅获取与特定分支或提交相关的对象:
git fetch origin refs/heads/branch:refs/remotes/origin/branch
Run Code Online (Sandbox Code Playgroud)
这将仅下载远程分支中包含的提交branch (并且仅下载您错过的提交),并将其存储在其中origin/branch.然后,您可以合并或结帐.
您还可以仅指定SHA1提交:
git fetch origin 96de5297df870:refs/remotes/origin/foo-commit
Run Code Online (Sandbox Code Playgroud)
这将仅下载指定的SHA-1 96de5297df870(及其遗漏的祖先)的提交,并将其存储为(不存在的)远程分支origin/foo-commit.
小智 60
我对我的git repo做了一个拉动:
git pull --rebase <repo> <branch>
Run Code Online (Sandbox Code Playgroud)
允许git拉入分支的所有代码然后我去重置到我感兴趣的提交.
git reset --hard <commit-hash>
希望这可以帮助.
Flo*_*low 48
您只需使用即可获取远程仓库的单个提交
git fetch <repo> <commit>
Run Code Online (Sandbox Code Playgroud)
哪里,
<repo>可以是远程仓库名称(例如origin)甚至是远程仓库URL(例如https://git.foo.com/myrepo.git)<commit> 可以是SHA1提交例如
git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545
Run Code Online (Sandbox Code Playgroud)
在您获取提交(和缺少的祖先)之后,您只需将其签出即可
git checkout FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)
请注意,这将使您处于"独立头"状态.
Sér*_*gio 16
您只需使用以下命令获取远程仓库即可:
git fetch <repo>
Run Code Online (Sandbox Code Playgroud)
哪里,
<repo>可以是远程仓库名称(例如origin)甚至是远程仓库URL(例如https://git.foo.com/myrepo.git)例如:
git fetch https://git.foo.com/myrepo.git
Run Code Online (Sandbox Code Playgroud)
在您获取了repos后,您可以合并您想要的提交(因为问题是关于检索一个提交,而是合并您可以使用cherry-pick来选择一个提交):
git merge <commit>
Run Code Online (Sandbox Code Playgroud)
<commit> 可以是SHA1提交例如:
git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545
Run Code Online (Sandbox Code Playgroud)
要么
git merge 0a071603d87e0b89738599c160583a19a6d95545
Run Code Online (Sandbox Code Playgroud)
如果是要合并的最新提交,您还可以使用FETCH_HEAD变量:
git cherry-pick (or merge) FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)
这效果最好:
git fetch origin specific_commit
git checkout -b temp FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)
随意命名“temp”......不过这个分支可能是孤立的
| 归档时间: |
|
| 查看次数: |
342172 次 |
| 最近记录: |