前言

今天由于网速很慢,在git pull更新时我观看了git pull的日志,让我联想到和我现在从事的游戏开发中的热更热有一定的相似性,把思绪记录下来。

git pull 日志

使用tortoisegit更新本地仓库时打印的日志如下:

  1. git.exe pull --progress -v --no-rebase "origin"
  2. POST git-upload-pack (982 bytes)
  3. remote: Enumerating objects: 79, done.
  4. remote: Counting objects: 100% (79/79), done.
  5. remote: Compressing objects: 100% (46/46), done.
  6. remote: Total 74 (delta 40), reused 62 (delta 28), pack-reused 0
  7. From https://github.com/zhaoqingqing/blog_samplecode
  8. 07d975b..44772ac master -> origin/master
  9. Updating 07d975b..44772ac
  10. Fast-forward
  11. 这里是具体更新内容...
  12. 内容结束....
  13. 成功 (10094 ms @ 2020/3/16 9:09:58)

git pull 日志分析

这段一行一行的从字面上解释日志,并加上我的理解

POST git-upload-pack (982 bytes)

向github网站发送请求信息,这里会上传本地.git目录下保存的本地仓库数据,供远程分析

remote: Enumerating objects: 79, done.

遍历此次需要的文件数量

remote: Counting objects: 100% (79/79), done.

统计此次需要更新的文件对象信息

remote: Compressing objects: 100% (46/46), done.

压缩此次需要更新的文件为一个压缩包

remote: Total 74 (delta 40), reused 62 (delta 28), pack-reused 0

总量74(有变化的40个),未使用的62(有变化的28个)

开始从github下载更新

成功 (10094 ms @ 2020/3/16 9:09:58)

如果长期未更新,或所要更新的仓库的分支越多和仓库体积越大时,每次更新所耗时也越长。

游戏开发的热更新方法

此次看到torisegit更新的内容,让我想起游戏里下载更新,在我所开发的游戏中热更新有以下几种方法:

启动游戏 ——> 对比版本号,下载需要更新的差异zip包

启动游戏 ——> 对比资源列表,本地对比出差异文件列表,开始从差异列表中下载文件

git pull机制剖析和游戏热更新的对比

从上面分析tortoisegit的更新日志来看,它的更新机制有区别于上述我所使用的热更新方法

—————————机制剖析 start———————————

我分析git每次更新前,都会通过对比本地.git目录的记录和远程的最新版本进行对比,

然后得出差异文件,

在github网站动态生成一个此次需要更新文件的临时zip

下载更新文件到本地

下载到本地之后,同时更新.git目录的记录

—————————机制剖析 end———————————

本地的.git目录中保存了本地的文件记录,用于在更新时进行文件对比

.git目录分析

每次更新时,.git目录最常变化的文件和目录有:objects目录和这三个文件index,ORIG_HEAD,FETCH_HEAD

objects 目录下保存所有的本地对象,下载更新时,会修改此目录的具体文件

index文件 类似于文件列表,里面记录着本地所有的文件列表和一些其它信息

ORIG_HEAD 服务器版本号(服务器当前被拉取分支的版本号)

FETCH_HEAD 本地每个分支的版本号

.git目录下所有的文件列表如下:

  1. hooks\
  2. info\
  3. logs\
  4. objects\
  5. refs\
  6. ORIG_HEAD
  7. FETCH_HEAD
  8. index
  9. COMMIT_EDITMSG
  10. tortoisegit.data
  11. tortoisegit.index
  12. config
  13. HEAD
  14. packed-refs
  15. description

关于git pull机制和游戏开发热更新思考的更多相关文章

  1. 使用git pull时,项目没有更新?

    进入项目目录后,执行 git pull 命令,没有将项目更新,并提示下图: 提示:there is no tracking information for the current branch. 意思 ...

  2. git fetch和git pull之间的区别--转载

    原文地址:http://blog.csdn.net/a19881029/article/details/42245955 git fetch和git pull都可以用来更新本地库,它们之间有什么区别呢 ...

  3. git fetch and git pull &冲突

    1.git fetch和git pull之间的区别 git fetch只会将本地库所关联的远程库的commit id更新至最新,fetch不会改变代码,如果想使代码更新,需要使用git merge o ...

  4. (转)git fetch + merge 和 git pull 的区别

    转自:http://blog.csdn.net/a19881029/article/details/42245955 Git fetch和git pull都可以用来更新本地库,它们之间有什么区别呢? ...

  5. 【学习总结】Git学习-本地仓库覆盖式更新对于Git仓库的影响以及pull/push到GitHub

    < 许久不用Git之后的探索 > 准备日常更新自己的GitHub了.但是编写的文件平时不放在Git仓库路径下. 故测试覆盖式更新对于仓库是否有影响 直接说结论: 通过对已有库的测试发现覆盖 ...

  6. Git 代码更新:git fetch 和 git pull 的区别

    Git 从远程的分支获取最新的版本到本地有这样 2 个命令: 1. git fetch:相当于是从远程获取最新版本到本地,但不会自动 merge git fetch origin master git ...

  7. 【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge【转】

    本文转载自:http://blog.csdn.net/liuchunming033/article/details/45367629 git pull的作用是,从远程库中获取某个分支的更新,再与本地指 ...

  8. git pull更新错误解决办法

    Your local changes to the following files would be overwritten by mergeerror: Your local changes to ...

  9. 第三方git pull免密码更新

    方法一: git pull http://账号:密码@服务器地址/xxx/xxx.git master:master 方法二: 或者使用ssh免密码,生成的pub公钥内容拷贝的auth文件里面,同时添 ...

  10. 详解git pull和git fetch的区别

    前言 在我们使用git的时候用的更新代码是git fetch,git pull这两条指令.但是有没有小伙伴去思考过这两者的区别呢?有经验的人总是说最好用git fetch+git merge,不建议用 ...

随机推荐

  1. Solon 开发进阶,五、全局异常订阅

    Solon 开发进阶 一.插件扩展机制 二.体外扩展机制 三.常用配置说明 四.启动参数说明 五.全局异常订阅 所谓"全局异常",是指通过事件总线发布的异常.目前框架会把未吃掉的异 ...

  2. Mac 开发 | IDEA 设置 Mybatis 的XML SQL 语句提示

    1.IDEA 链接数据库 2.IDEA 设置数据库方言为链接的数据库方言 3.IDEA SQL 解析范围设置 4. 可以在mapper xml 中写select 测试了.

  3. AtCoder Beginner Contest 189 Personal Editorial

    第一次参加 AtCoder 的比赛,感觉还挺简单. 比赛链接:https://atcoder.jp/contests/abc189 A - Slot // Author : RioTian // Ti ...

  4. mybatisplus 查询结果排除某字段实现

    数据有Test表,表里有id,name,ip_address,last_time四个字段 通常查询写法,返回结果会把id,name,ip_address,last_time四个字段都返回 public ...

  5. C#读取FX5U线圈(modbusTCP)

    第一步:导入所需的类库 第二步:包含命名空间 第三步:实例化modbus类 ModbusTcpNet busTcpClient = null; busTcpClient = new ModbusTcp ...

  6. 文件上传accept参数可接受的类型汇总

    https://www.cnblogs.com/huihuihero/p/17012817.html 1 // 文件上传accept接受的文件类型 2 3 export const fileTypes ...

  7. 在vue项目中使用momentjs获取今日、昨日、本周、本月、上月、本年、上年等日期,时间比较计算

    https://blog.csdn.net/qq_15058285/article/details/119925056

  8. 全流程机器视觉工程开发(一)环境准备,paddledetection和labelme

    前言 我现在在准备做一个全流程的机器视觉的工程,之前做了很多理论相关的工作.大概理解了机器视觉的原理,然后大概了解了一下,我发现现在的库其实已经很发展了,完全不需要用到非常多的理论,只需要知道开发过程 ...

  9. [QML]从零开始QML开发(二)QML开发,浅谈控件、槽函数、锚等基本概念。QML和C++怎么交互?贯彻落实MVC原则

    [QML]从零开始QML开发(二)QML开发,浅谈控件.槽函数.锚等基本概念.QML和C++怎么交互?贯彻落实MVC原则 先看代码: import QtQuick 2.12 import QtQuic ...

  10. 广搜 广搜 poj 3984

    ***求最短路径,然后再输出路径, BFS+路径输出*** #include <iostream> #include <cstdio> #include <cstring ...