git 如何备份(从游戏存档的保存聊聊Git远程版本库)

如何保障存档不丢失?

到目前为止,我们的所有操作都是在本地执行的。也就是说,存档信息和游戏内容实际是在一台机器上。此时,如果游戏机硬盘坏了,那所有的存档也都会丢失。你无法保障你的游戏机硬盘永远不坏。对于这个问题,我们该如何来解决呢?一个简单的方式,就是我们存档完之后,将存档文件再拷贝到另外一个硬盘上。如果当前游戏硬盘挂掉了,我们可以将备份硬盘中的存档拷贝回来就可以了。大致流程如下所示:

  • 对游戏进行存档操作
  • 将备份硬盘连接到游戏机
  • 将存档拷贝到备份硬盘
  • 每个存档占用独立的目录,目录取不同的名字
  • 当需要恢复时,将对应目录中的存档拷贝回游戏机即可

如果使用了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中的一模一样。上述流程如下图所示:

git 如何备份(从游戏存档的保存聊聊Git远程版本库)(1)

裸库

现在,我们只需要在我们的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被称为是分布式版本库的原因。下面,我们来看一看,多人游戏时,如何进行存档的管理。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页