网站首页 > 技术文章 正文
如何保障存档不丢失?
到目前为止,我们的所有操作都是在本地执行的。也就是说,存档信息和游戏内容实际是在一台机器上。此时,如果游戏机硬盘坏了,那所有的存档也都会丢失。你无法保障你的游戏机硬盘永远不坏。对于这个问题,我们该如何来解决呢?
一个简单的方式,就是我们存档完之后,将存档文件再拷贝到另外一个硬盘上。如果当前游戏硬盘挂掉了,我们可以将备份硬盘中的存档拷贝回来就可以了。
大致流程如下所示:
- 对游戏进行存档操作
- 将备份硬盘连接到游戏机
- 将存档拷贝到备份硬盘
- 每个存档占用独立的目录,目录取不同的名字
- 当需要恢复时,将对应目录中的存档拷贝回游戏机即可
如果使用了Git,那就不需要每次都创建一个独立目录了,每次覆盖即可。在将存档拷贝回游戏机后,通过Git指令来切换存档即可。
但是,你每次还是要手动将存档全量拷贝到备份硬盘上。假设你的存档非常的大,有10G,每次拷贝都需要很长的时间。如果你某次只是玩了5分钟,存档只修改了一点,为了安全,你可能还是需要花30分钟来备份存档。
有没有办法每次只备份修改的存档呢?使用Git的远程仓库就可以满足上面的需求。
远程仓库
我们通过Git来模拟一下上面所述的完整备份流程。
首先,我们随便找个目录,执行如下命令初始化一个git仓库:
git init mario-bak
然后,我们进入mario-bak目录中,执行git log命令,你会发现这是一个空仓库,什么都没有:
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
接着,我们执行一下如下命令,同意接收远程推送:
git config receive.denyCurrentBranch ignore
现在,我们回到mario目录中。执行如下命令,将mario-bak仓库作为mario仓库的远程仓库。
git remote add origin file://${mario-bak全路径}/.git
接着,我们执行如下命令,将mario中的本地存档信息推送到远程仓库上。
git push origin master
我们再回到mario-bak目录中,执行git log指令,可以看到里面已经有存档信息了,并且存档记录与mario中的一模一样。
我们继续切回到mario目录中,再进行游戏。假设进行到了1-4关。
********
************
####....#.
#..###.....##....
###.......######
...........
##*####### 1 - 4
####*******######
...#***.****.*###....
....**********##.....
....**** *****....
#### ####
###### ######
然后进行存档:
git add player.txt
git commit -m 'm04'
执行git log命令,可以看到如下记录:
commit e2bbe8c77c70f870d3f46542649f8e269d0a01fc (HEAD -> master)
Author: 一瑜一琂
Date: Wed Mar 16 22:12:03 2022 +0800
m04
commit d3a1237365e2b2f1ceaf2939b35f6fca5ce99812 (origin/master)
......
commit b0d5581b592f3d5faaca744e88eed604f2289904
Author: 一瑜一琂
Date: Wed Mar 16 14:05:19 2022 +0800
m00
第1~5行,是新增的存档记录,注意第7行,最后有个(origin/master),表示远程存档只记录到了此处,最新的存档还没有,我们执行一下git push origin master,然后再次执行git log,可以看到如下信息:
commit e2bbe8c77c70f870d3f46542649f8e269d0a01fc (HEAD -> master, origin/master)
Author: 一瑜一琂
Date: Wed Mar 16 22:12:03 2022 +0800
m04
commit d3a1237365e2b2f1ceaf2939b35f6fca5ce99812
......
commit b0d5581b592f3d5faaca744e88eed604f2289904
Author: 一瑜一琂
Date: Wed Mar 16 14:05:19 2022 +0800
m00
注意第1行,远程分支也记录到了这里。我们切换到mario-bak目录中,执行git log命令,可以看到如下信息:
commit e2bbe8c77c70f870d3f46542649f8e269d0a01fc (HEAD -> master)
Author: 一瑜一琂
Date: Wed Mar 16 22:12:03 2022 +0800
m04
commit d3a1237365e2b2f1ceaf2939b35f6fca5ce99812
......
commit b0d5581b592f3d5faaca744e88eed604f2289904
Author: 一瑜一琂
Date: Wed Mar 16 14:05:19 2022 +0800
m00
可以看到,mario-bak中的记录和mario中的完全一致。
但是,我们会发现,mario-bak目录下,根本就没有player.txt文件。这个文件到哪去了呢?我们执行一下git status命令,可以看到如下信息:
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: player.txt
下面显示player.txt文件被删除了!但是,我们根本就没有删除这个文件,这里我们先不关注。
我们执行一下git reset --hard命令来恢复一下文件,执行完成后,你就会发现player.txt文件出现了,我们看一下player.txt文件中的内容:
********
************
####....#.
#..###.....##....
###.......######
...........
##*####### 1 - 4
####*******######
...#***.****.*###....
....**********##.....
....**** *****....
#### ####
###### ######
和mario中的内容是完全一致的。
同时你还会发现,mario中的load-00分支的存档信息也全部在mario-bak中。
至此,我们就可以通过远程仓库来保存存档了。
此时如果我们本地的mario存档丢失了怎么办呢?我们可以通过如下命令进行恢复
git clone mario-bak mario-recovery
进入到mario-recovery中,你会发现里面的存档信息和mario中的一模一样。
上述流程如下图所示:
裸库
现在,我们只需要在我们的mario目录中进行相关操作,就可以实现存档的保存、恢复、远程备份等操作。根本不用关心远程仓库,更不会关心远程仓库目录里有没有对应的文档信息。所以,实际上远程仓库目录中的文档本身没有任何用处,我们只需要提交记录即可。
git支持称为「裸库」的版本库,即是为这种场景准备的。我们通过如下命令来创建一个裸库。
git init mario-remote --bare
我们把mario-bak这个远程仓库给删了,不用担心数据会丢失,我们本地有一份,随时都可以恢复。
rm -rf mario-bak
接着,我们进入到我们的游戏档案目录mario里
cd mario
将远程仓库配置删除,将mario-remote添加为新的远程仓库。
git remote rm origin
git remote add origin file://${mario-remote全路径}
注意这里路径的差异,没有了后面的.git。
然后我们直接将存档数据推送过去。
git checkout master
git push origin master
git checkout load-00
git push origin load-00
现在我们来验证一下我们有没有推送过去呢?我们进入mario-remote目录,发现里面的目录结构和我们的本地存档目录完全不同。
我们现在先不管这些,我们可以把裸库克隆下来,来验证我们的推送是否成功了。
git clone file://${mario-remote全路径} mario-check
cd mario-check
git log
git branch --all
你会发现存档都在,说明我们已经将数据推送到裸库上去了。
至此为止,你就得到了前文中的git结构了。你可以安心的继续进行游戏了。
总结
从上面的流程,你应该可以感觉到,git的远程版本库和本地版本库其实没什么区别:
- 你的版本库相对于你自己来说是本地版本库,而相对于别人来说,就是远程版本库;
- 反过来,别人的版本库相对于他自己就是本地版本库,而相对于你就是远程版本库。
这也就是git被称为是分布式版本库的原因。
下面,我们来看一看,多人游戏时,如何进行存档的管理。
猜你喜欢
- 2024-10-07 如何编写gitignore文件(git怎么用)
- 2024-10-07 Git 工具 - 子模块(github 子模块)
- 2024-10-07 用git管理版本,你必须知道的事情
- 2024-10-07 详解Github的.gitignore忽略文件+.gitignore不生效解决+生产配置
- 2024-10-07 Git数据迁移:迁移代码到新仓库(git版本库迁移)
- 2024-10-07 收藏就行了:最全git总结(gitjournal)
- 2024-10-07 程序员必须掌握版本控制的工具 --- git(一)
- 2024-10-07 Github怎么上传超过100M的大文件?
- 2024-10-07 Git最全总结(git ci)
- 2024-10-07 Git使用的小技巧(git的使用超详细版教程)
- 1517℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 596℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 521℃MySQL service启动脚本浅析(r12笔记第59天)
- 489℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 456℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)