如果 git fetch 中途取消,它会恢复吗?

2023-11-21

有时获取任何 git 存储库(通过执行“git fetch repository_URL") 可能需要几个小时,具体取决于存储库的大小和网络速度。

如果由于某种原因用户中途取消了提取,然后稍后尝试在他/她取消上次提取的完全相同的环境中提取相同的存储库,那么提取将如何工作?

它会从中断处恢复提取吗?


否(2015 年)或可能很快(2018 年第 4 季度),git clone/fetch/pull操作没有“恢复”功能。

自那以后:

  • 2018 年第四季度,Git 2.18 和 2.19 引入了 Wire v2 协议.
  • GitLab 将从 2018 年 10 月开始支持它.

2015:

唯一的选择,在这个线程中提到, is gitolite(这是一个管理 ACM 的 Perl 脚本——您的存储库的访问控制级别,并提供围绕 git 访问的其他实用程序)

gitolite 可以配置为更新“Git 包”(请参阅git-bundle manual)然后可以通过 rsync 或 HTTP 协议,然后可以使用 rsync 客户端下载 支持断点续传的HTTP客户端。

使用此技术可以使“下载所有内容”和“从下载的内容中创建存储库”步骤截然不同,并且可以使用任意次数的尝试来执行第一步。

缺点也很明显:

  1. 这需要在服务器端进行特殊设置。
  2. 目前尚不清楚如果有人设法更新存储库会发生什么 当有人下载​​其捆绑包或更新时 相邻下载尝试之间。

关于可恢复功能git clone/fetch(在“如何在连接不稳定的情况下完成大项目的git克隆?”),最近(2016 年 3 月)有一次关于git 邮件列表.

  • 一种方法是让服务器生成可以加载的包(使用resumewget -c!)并添加到本地存储库(因为捆绑包是one您可以从中克隆文件,就好像它是 git 存储库一样)。
    See "从捆绑包克隆 Linux"

That is:

wget -c https://cdn.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle
git bundle verify clone.bundle
...
clone.bundle is okay
git clone clone.bundle linux
#Now, point the origin to the live git repository and get the latest changes:
cd linux
git remote remove origin
git remote add origin https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git pull origin master
  • 另一种方法是可恢复的实际实施git clone,在此线程中讨论

我们可以通过混合以下方式来实现可恢复克隆 智能和愚蠢的HTTP协议。

  1. A git clone最终调用传输层,并且git-remote-curl将探测信息/克隆 URL;如果资源 无法加载,一切都通过传统的代码路径。

  2. When git-remote-curl检测到哑克隆的支持,它会执行以下操作 “重试,直到成功完全下载包数据”舞蹈 在内部,暂时更新远程跟踪引用,然后 假装好像被要求进行增量获取。如果这 成功,没有任何die(),皆大欢喜。

  3. If the above step 3. has to die() for some reason (including impatience hitting CTRLC), leave the $GIT_DIR, downloaded .info file and partially downloaded .pack file.
    Tell the user that the cloning can be resumed and how.

请注意,这是针对可恢复克隆的,not可恢复的获取:

最初的“克隆”和随后的增量“获取”是正交问题.

因为提议的“克隆”更新比 建议更改为“fetch”,即

  • 传输的数据量要大得多,因此 在网络环境较差的情况下,网络超时的几率为 高得多,恢复的需要就大得多。
  • 该方法不仅使“克隆”可恢复并且有帮助 客户端,它可以帮助服务器卸载批量传输到 CDN。

并且它对现有代码的损害要小得多,即

  • 我们不必悲观包装过程,只需丢弃 生成的大量字节,就像建议的方法一样 对于“获取”。
  • 需要新代码的区域被很好地隔离并且切换到 新协议在交换过程中很早就发生,但没有共享 代码到现有的代码路径;这些特性使其风险较小 引入回归。

为了避免新协议中仅使用 HTTP 功能,有人提议使用“v2”协议,让双方在 ref 通告之前交换功能。然后,客户端在看到服务器的可恢复 URL 后,就知道是否继续进行广告。
See stefanbeller/gitprotocol2-102017年7月。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 git fetch 中途取消,它会恢复吗? 的相关文章

  • Git:设置仅获取远程?

    当我跑步时git remote v在我配置了远程的 Git 存储库之一中 我看到每个远程都具有获取和推送规范 git remote v
  • git commit 给出错误:空提交集已通过

    当尝试恢复到以前的提交时 我尝试了 git revert no commit 0766c053 HEAD 然而这给出了一个错误 empty commit set passed 问题 该错误是什么意思 以及出了什么问题revert命令 删除
  • 为不同分支部署GitLab页面

    我正在使用 GitLab Pages 部署我的 React 应用程序 并且运行良好 这是我的gitlab ci yml Using the node alpine image to build the React app image nod
  • 从 Git 中的分支父级中提取更改

    如何从 Git 中的分支的父级中提取更改 特别是在 github 配置的项目中 例如 假设我分叉了http github com originaluser originalproject http github com originalus
  • git merge 中“递归合并模式”旁边的这些符号是什么?

    当我使用git pull project name master为了更新我的核心文件 我在 递归合并 下得到了一堆绿色的加号和红色的减号信号 这些符号是什么以及它们的含义是什么 这是一个屏幕截图 感谢您的帮助 这是已更改的行数的近似值 优点
  • 使用 GIT_PS1_SHOWCOLORHINTS 自定义 __git_ps1 的颜色

    我尝试过的 我已更新我的提示以包含分支名称 git ps1 另外 我设置GIT PS1 SHOWCOLORHINTS 问题 提示正确显示 然而 树枝的颜色始终是绿色的 我预计肮脏的树枝会是红色的 文档指出 颜色基于 git status s
  • 将生成的文件存储在 Git 中

    我们有一个相当大且过于混乱的代码库 我们希望使用 Git 进行迁移 目前 它是一个大的整体块 不能轻易地分割成更小的独立组件 该代码构建了大量共享库 但它们的源代码如此交错 目前无法将其干净地分离到单独的存储库中 我不太关心 Git 是否可
  • Maven 找不到 .git (dotGitDirectory)

    我有一个与所问问题类似的问题here https stackoverflow com questions 31159484 mavengit commit id plugin git directory could not be found
  • 我如何自动接受 git rebase --interactive 呈现给我的内容?

    我正在使用一个小脚本来修复过去的提交 该脚本假设已暂存对损坏的提交的修复 工作目录是干净的 并且损坏的提交是在命令行上传递的 这是脚本的原始 Python 核心 usr bin env python import os import sys
  • 在 Github 提交中强制执行 PEP-8'ish 格式

    是否有任何预制解决方案可以在 Git 提交挂钩中强制执行良好的 Python 标准 有没有办法在本地结帐中自动执行此过程 类似于 Bazaar 可以将提交挂钩推送给客户端 当您签出存储库时 它会安装提交挂钩 这应该足够了 无需运行进一步的工
  • 即使在签出到另一个分支后也无法删除本地分支

    我正在尝试删除我的本地分支并尝试了我在这里找到的大多数解决方案 即签出到另一个分支然后运行git branch D or d
  • 如何使用 jenkins shell 创建新的 git 分支

    我想达到以下目标 在某些詹金斯工作中 从 dev branch 创建一个新分支 对新创建的分支 new branch 进行一些更改 将新创建的分支推送到 git repo 我在詹金斯中执行了以下步骤 我已经在 源代码管理 部分配置了我的 g
  • Azure DevOps/VSTS 始终在干净的存储库上报告“DETACHED HEAD”

    Friends 我现在厌倦了 Azure DevOps VSTS Jenkins 好多了 现在仍然如此 只是我的组织想要使用 Azure DevOps 我有一个谜团需要帮助来解决 以下是我的笔记本电脑上的存储库 它没有未跟踪或未提交的更改
  • 如何列出当前正在验证的拉取请求中更改的所有文件(在 VSTS 中)?

    我有一个 PR 验证版本 我想列出 PR 中更改的所有文件以及状态 源在每个构建上同步 因此 在合并 PR 更改之前 源位于修订版A 通常origin master 让我将 PR 合并提交指定为B 我当前的实现调用git diff tree
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 获取引用而不下载对象[重复]

    这个问题在这里已经有答案了 我想检查 origin master 是否与我的 HEAD 不同 I do not想要git fetch 因为它可能非常昂贵 我滥用 git 的方式使得成本高得令人望而却步 任何允许我从远程获取提交列表或顶部提交
  • 理解 git log --stat 输出

    我试图理解的输出git log stat命令 第一个输出 commit 4c90aee323acc337a37040e02a0a3644f4155738 Date Fri May 1 22 46 11 2015 0400 Submittin
  • 在 git 中编辑分支?

    我在 github 网站上创建了一个分支 该分支不在我的本地存储库中 如何将该分支带到我的本地计算机 对其进行编辑 然后将其推送回我的 github 帐户 在本地工作目录中输入 git fetch origin newbranch git
  • Git 二进制文件与 .gitattributes 中的 -diff

    在 gitattributes 中有以下等价内容 chm binary chm diff 我努力了 chm二进制文件 但恐怕它仍然可能尝试合并这些文件 是 diff更适合我打算做什么 另外 在提交给定类型的文件后 此设置是否适用 Thank
  • 有什么方法可以有效地应用大型 git 补丁吗?

    我们收到了一个大补丁 修改了大约 17000 个文件 其大小为5 2G 应用补丁时git apply 3 12个小时后还没有完成 我们将每个文件的补丁分成更小的补丁 然后一一应用它们 这样至少我们可以看到进度 再次卡在一个文件补丁上 仍然有

随机推荐