精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

國慶節就到,一起寫一個Linux初版的Git吧

系統 Linux
各位讀者就算不了解git的原理,想必也會用三把斧 git add; git commit; git push,下面就簡單說一下git是怎么做的版本管理的:跟蹤文件的變化,使用commit作為標記,與遠程服務器同步。

[[426802]]

Naive Git

一起寫一個簡單的Git吧!

前言

我與兩個師弟一起成立一個 git org,主要是他們(我需要工作,劃水出主意做PM居多)做一些趣味使然的項目,PioneerIncubator[9],這個 git 是第三個項目,第一個項目是 betterGo,我好幾個月前就寫好初版了,就等他們做一些完善補充工作了,之后會單獨介紹。第二個項目是剛動手,他們搜了一下,發現上年十月發現有人做了,那個項目還有500多star了。

Git的原理是怎么樣呢?

Git is a distributed version-control system for tracking changes in source code during software development.

各位讀者就算不了解git的原理,想必也會用三把斧 git add; git commit; git push,下面就簡單說一下git是怎么做的版本管理的:跟蹤文件的變化,使用commit作為標記,與遠程服務器同步。

跟蹤文件變化

假如你來開發git這個工具,在初始化一個文件夾(repository)后,為了記錄之后可能的修改,你需要記錄當前所有需要跟蹤的文件內容,最簡單的就是全部復制一份好了。

文件是否變化了?比較一下文件哈希好了。

Commit作標記

顧言思義,就是將當前的 repository 狀態存儲起來,作為commit。你可以通過 commit 恢復到任意狀態,git tag 本質也只是給這個 commit 一個 tag(別名),git branch 也是一樣。

恢復到某一個 commit,就是將它所代表的 repository 狀態恢復起來,就是將文件全部內容以及當前commit恢復到那個狀態。

與遠程服務器同步

git說自己是分布式的版本管理系統,是因為假如A、B、C三個人一起合作,理論上每個人都有一份server的版本,而且可以獨立開發,解決沖突。

Git具體是怎么做的呢?

原理說完了,但commit的管理是要用東西來存儲讀取管理的,Git沒有用數據庫,直接將其內容放到.git 文件夾里。

里面有什么內容呢?

  1.   |-- HEAD //指向branch、tag (ref: refs/heads/devbranch) 
  2.   |-- index 
  3.   |-- objects 
  4.   |   |-- 05 
  5.   |   |   `-- 76fac355dd17e39fd2671b010e36299f713b4d 
  6.   |   |-- 0c 
  7.   |   |   `-- 819c497e4eca8e08422e61adec781cc91d125d 
  8.   |   |-- fe 
  9.   |   |   `-- 897108953cc224f417551031beacc396b11fb0 
  10.   |   |-- fe 
  11.   |   |   `-- 897108953cc224f417551031beacc396b11fb0 
  12.   |   |-- info 
  13.   |   
  14.   `-- refs 
  15.       |-- heads //各個branch的heads 
  16.       |   `-- master //此分支最新的commit id 
  17.       |   `-- devBranch // checkout -b branch就會生成的branch 
  18.       `-- tags 
  19.           `-- v0.1 

各位再結合

下面我展開講講:

  • HEAD: 指向branch或者tag,標記當前是在哪個分支或者tag上;
  • index:TODO
  • objects:記錄文件的內容,每個文件夾名稱是該object的sha1值的前兩位,文件夾下的文件名稱是sha1值的后18位;(tips:sha1算法,是一種加密算法,會計算當前內容的哈希值,作為object的文件名,得到的哈希值是一個用十六進制數字組成的字符串(長度為40))
  • refs
  • heads: heads 里的就是各個分支的 HEAD 分別指向哪個 commit id;簡單說,就是 各個branch分別最新的commit是什么,這樣子 git checkout branch 就可以切換到對的地方
  • tags: 同理,這個文件夾里存的都是各個tag

那么,新建一個branch的時候,只要在 refs/heads 文件夾里新建branch 名字的文件,并將當前commit id存進去即可;

新建一個commit時,只要根據 HEAD 文件,找到當前的 branch或者tag 是什么,修改里面的內容即可。

有點不好懂?咱給出一個git的實例,默認在一個文件夾執行 git init 后,添加一個文件并 commit 的信息, commit id為 017aa3d7851e8bbff78a697566b5f827b183483c:

  1. $ cat .git/HEAD 
  2. ref: refs/heads/master 
  3. $ cat .git/refs/heads/master 
  4. 017aa3d7851e8bbff78a697566b5f827b183483c 

如上,HEAD 指向了master,而 master 的commit id正是剛剛commit的id。

存儲讀取解決了,那么commit怎么組織呢?

將當前的 repository 狀態存儲起來,作為commit。你可以通過 commit 恢復到任意狀態,git tag 本質也只是給這個 commit 一個 tag(別名),git branch 也是一樣。

恢復到某一個 commit,就是將它所代表的 repository 狀態恢復起來,就是將文件全部內容以及當前commit恢復到那個狀態。

上面說了,管理文件夾(repository)狀態,但是文件夾是可以嵌套的,與文件不一樣,需要有這層級關系,同時也要存文件內容,怎么做來區分呢?

我們可以引入以下概念:

  • Tree:代表文件夾,因為 git init 時,就是把當前文件夾./ 作為項目來管理,那么接下來所有要追蹤的項目無非就是./ 里的文件或者文件夾而已;
  •  Blob:文件,Tree里可以包含它;

關系如下圖:

給點我們寫的數據結構代碼你看看,要注意的是,tree 可以擁有 blob 或者 tree,所以用了 union;parent 與 next 作為鏈表使用,作為文件夾目錄管理;

  1. struct tree_entry_list { 
  2.     struct tree_entry_list *next
  3.     union { 
  4.         struct tree *tree; 
  5.         struct blob *blob; 
  6.     } item; 
  7.     struct tree_entry_list *parent; 
  8. }; 
  9.  
  10. struct tree { 
  11.     struct tree_entry_list *entries; 
  12. }; 

而 commit 跟樹一樣,也是有層級的單鏈表,不過只有

  1. struct commit { 
  2.     struct commit *parents; 
  3.     struct tree *tree; 
  4.  
  5.     char *commit_id[10]; 
  6.     char *author; 
  7.     char *committer; 
  8.     char *changelog; 
  9. }; 

一圖勝千言,看圖吧:

如上,有三個commit,先后順序為:1 -> 2 -> 3, 3是最新的。

  • 畫圈的blob是文件內容,代表這個文件在commit 1跟2都沒有變化,所以復用了同一個;
  • 畫正方形的,也是同一個文件,但是內容有變化了,所以分別指向了不一樣的blob;
  • tag 指向了commit 2;
  • HEAD 跟 branch 都在最新的commit 3,新增了一個文件;

于是通過commit記錄變動的內容,就是可以從上而下的恢復所有有變更的文件。

如圖,checkout 到 v0.1的tag,就是找到此commit id,然后恢復commit下的tree的文件:

云風的游戲資源倉庫及升級發布

云風參考過git的原理做過一個游戲資源倉庫管理,我下面講一下它跟git的區別,他的文章[10]我覺得比較繞,沒有背景知識的人很難看明白。

背景

我們的引擎的一個重要特性就是,在 PC 上開發,在移動設備上運行調試。我們需要頻繁的將資源同步到設備上

程序以 c/s 結構運行時,在移動設備上先建立一個空的鏡像倉庫,同步 PC 端的資源倉庫。運行流程是這樣的:

首先在客戶端啟動的時候,向服務器索取一個根索引的 hash ,在本地鏡像上設定根。

客戶端請求一個文件路徑時,從根開始尋找對應的目錄索引文件,逐級查找。如果本地有所需的 hash 對象,就直接使用;否則向服務器請求,直到最后獲得目標文件。api 的設計上,open 一個資源路徑,要么返回最終的文件,要么返回一個 hash ,表示當前還缺少這個 hash 對象;這樣,可以通過網絡模塊請求這個對象;獲得該對象后,無須理會這個對象是什么,簡單寫入鏡像倉庫,然后重新前面的過程,再次請求未完成的路徑,最終就能打開所需的資源文件。

場景是:Client <- 他的游戲服務器 ,單向同步;

他是這樣子做的,客戶端的倉庫是 key-value 的文件數據庫,key是文件的hash,value就是文件內容;

同步時,會從根到具體hash全量同步文件下載到數據庫;

假如客戶端使用資源時,發現缺乏這個文件,就用hash去服務器拉下來。

換言之,因為不需要管理本地版本,并且同步到上游,所以無需在本地記錄全量的版本狀態

跟Git的區別:

場景是:Client <-> gitHub ,雙向同步;

git 需要本地組織commit,切換本地有但服務器沒有的版本(就是離線操作) ,同時還需要將變更同步到上游。

最后的建議

如果看完該文,讓你躍躍欲試的話,請不要用C寫,請不要用C寫,請不要用C寫。

從零開始寫過幾個大一點項目,每次都覺得用C寫項目太難受了,這次我寫 git commit 時,發現要讀寫文件,解析內容,我發出了內心的感嘆:

太難了,不是寫這個難,是C太難用了。。

想到我要遍歷這些文件,根據目錄得到tree的hash,然后還要update這棵樹,把tree跟commit還要blob反序列存到文件里,還要讀出來,之后還要組織鏈表操作,用C寫就覺得百般阻撓。。。

具體實現,git rebase,git merge等進階內容,就要等下一篇了。

本文轉載自微信公眾號「山盡寫東西的cache」,可以通過以下二維碼關注。轉載本文請聯系山盡寫東西的cache公眾號。

 

責任編輯:武曉燕 來源: 山盡寫東西的cache
相關推薦

2021-12-30 06:59:27

視頻通話網頁

2015-02-09 09:26:26

程序員

2015-02-09 10:55:50

編程女程序員

2023-04-11 07:48:32

WebGLCanvas

2024-08-29 09:18:55

2023-11-06 08:28:43

2024-08-02 09:49:35

Spring流程Tomcat

2024-06-17 11:59:39

2021-10-27 06:49:34

線程池Core函數

2022-08-29 07:48:27

文件數據參數類型

2024-08-12 15:55:51

2022-02-22 10:50:19

IDEAGit工具,

2012-11-08 17:33:53

智慧云

2021-11-15 11:03:09

接口壓測工具

2022-06-27 08:00:49

hook工具庫函數

2015-10-02 12:36:28

國慶節51cto專題云計算入門

2024-09-04 08:55:56

2022-09-28 13:57:41

鴻蒙開源
點贊
收藏

51CTO技術棧公眾號

福利精品视频在线| 久久精品国产99国产精品| 亚洲成人亚洲激情| 激情综合网俺也去| 麻豆最新免费在线视频| 成人国产精品免费观看视频| 国产精品jizz在线观看麻豆| 麻豆精品一区二区三区视频| 亚欧日韩另类中文欧美| 91精品蜜臀在线一区尤物| 国产精品一区二区免费在线观看| av网站在线免费播放| 成人精品视频.| 国产免费一区二区三区在线观看| 日韩 欧美 精品| 欧美国产一级| 亚洲美女视频网站| 久久久国产精品久久久| 成人精品高清在线视频| 精品女同一区二区三区在线播放| 日本黄色播放器| 青梅竹马是消防员在线| 国产91丝袜在线18| 91精品中国老女人| 超碰在线免费97| 一本久久知道综合久久| 欧美日韩xxx| 中文乱码字幕高清一区二区| 成人毛片在线免费观看| 日本不卡在线视频| 欧美一区二区三区…… | 国产欧美啪啪| 日韩美女视频一区二区| 欧美性bbwbbwbbwhd| 亚洲第一视频在线播放| 精品一区二区三区av| 日本一欧美一欧美一亚洲视频| 久久久一二三区| 久久视频国产| 在线精品国产欧美| 五级黄高潮片90分钟视频| 国产精品115| 精品免费国产一区二区三区四区| 精品亚洲视频在线| 黄黄的网站在线观看| 久久久99久久精品欧美| 精品一区二区久久久久久久网站| 亚洲欧美另类日韩| 国产aⅴ精品一区二区三区色成熟| 成人黄色午夜影院| 91精品视频免费在线观看| 麻豆精品精品国产自在97香蕉| 国产精品成人一区二区三区吃奶| 伦av综合一区| 日韩电影在线免费看| 国产精品久久久久999| 黄色av一区二区| 蜜桃一区二区三区在线观看| 国产欧美精品xxxx另类| 国产精品久久久久久无人区| 精品一区二区在线免费观看| 亚洲www视频| 日本一区二区欧美| 亚洲免费激情| 欧美一级淫片videoshd| 国内av在线播放| 麻豆国产精品777777在线| 国产欧美精品一区二区| 国产喷水吹潮视频www| 国产宾馆实践打屁股91| 国产日本一区二区三区| 你懂的在线观看视频网站| 欧美国产精品久久| 不卡日韩av| 女人18毛片水真多18精品| 91在线精品秘密一区二区| 欧美日韩精品综合| 91ph在线| 亚洲一区二区在线播放相泽| 成年人视频观看| av成人在线观看| 日韩免费性生活视频播放| 中国极品少妇videossexhd| 国产区精品区| 久久国产精品久久国产精品| 日韩少妇高潮抽搐| 日本欧美加勒比视频| 92看片淫黄大片欧美看国产片| 亚洲精品免费在线观看视频| 久久你懂得1024| 黄瓜视频免费观看在线观看www| 青青在线视频| 欧美在线你懂的| 日本三级免费观看| 伦一区二区三区中文字幕v亚洲| 图片区日韩欧美亚洲| 免费男同深夜夜行网站| 国产免费区一区二区三视频免费| 欧洲av在线精品| 青青草原播放器| 欧美天堂一区二区| 亚洲国产高清自拍| 欧美性生给视频| 国产欧美午夜| 亚洲自拍偷拍色图| 国产精品一区二区婷婷| 亚洲一卡二卡三卡四卡五卡| 亚洲人辣妹窥探嘘嘘| 国产中文在线播放| 7777精品久久久大香线蕉| 国产xxxxxxxxx| 亚洲激情五月| 国产成人av网址| 日本成人动漫在线观看| 国产精品高潮呻吟| 国产淫片av片久久久久久| 亚洲网一区二区三区| zzijzzij亚洲日本成熟少妇| 欧美精品日韩在线| 99热这里只有精品8| 91网在线免费观看| av在线免费观看网站| 精品动漫一区二区三区| 在线观看一区二区三区视频| 色综合久久网| 国产精品久久久久久久久久尿| 国产亚洲精品久久久久久无几年桃| 日韩av不卡在线观看| 久久精品人人做人人爽电影| 欧洲一区二区三区| 91精品国产福利在线观看| 日本猛少妇色xxxxx免费网站| 久久国产精品99国产| 国产精品手机在线| 美女做暖暖视频免费在线观看全部网址91 | 国产九区一区在线| 成人直播在线| 在线成人免费视频| 亚洲区一区二区三| 麻豆国产精品777777在线| 色噜噜狠狠色综合网| 美女网站在线看| 日韩av在线播放资源| 日韩av综合在线| 不卡的av网站| 精品少妇人妻av免费久久洗澡| 超碰精品在线| 午夜精品www| 色呦呦中文字幕| 久久男人中文字幕资源站| 天天夜碰日日摸日日澡性色av| 综合欧美亚洲| 性色av一区二区三区免费| 日本韩国免费观看| 亚洲电影第三页| 日本五十肥熟交尾| 国产精品免费看| 欧美日韩中文国产一区发布| 澳门av一区二区三区| 一区二区三区四区视频| 一区二区三区亚洲视频| 亚洲日本在线视频观看| 不卡的一区二区| 亚洲日本黄色| 国产精品亚洲аv天堂网| 成人在线免费电影| 4438亚洲最大| 久久亚洲成人av| 99riav一区二区三区| 少妇高清精品毛片在线视频| 欧美一区电影| 国产一区玩具在线观看| 四虎亚洲精品| 日韩精品免费在线播放| 国产日韩久久久| 亚洲桃色在线一区| 久久久久久久久久久久国产精品| 日韩视频不卡| 亚洲精品成人自拍| 999久久久精品一区二区| 4438全国亚洲精品在线观看视频| av在线免费观看网| 亚洲成人av片在线观看| 性色av一区二区三区四区| 亚洲男人的天堂网| 人妻无码中文久久久久专区| 国产综合亚洲精品一区二| 日本一本a高清免费不卡| 午夜激情视频在线| 精品久久久久久久久久久久包黑料| 免费av网站在线| 中文字幕一区二区三区视频| 在线看黄色的网站| 麻豆成人综合网| 欧美二区在线视频| 99精品在线| 国产精品中文字幕在线观看| 日本在线视频网址| 中文字幕亚洲综合| 无码国产精品一区二区免费16| 欧美日韩日本视频| 91蜜桃视频在线观看| 中文字幕亚洲视频| 精品人妻一区二区三区日产乱码卜 | 成人97在线观看视频| 日韩三级电影网| 日韩视频在线一区二区| 中文字幕欧美人妻精品一区蜜臀| 亚洲一区在线免费观看| 熟女少妇a性色生活片毛片| 93久久精品日日躁夜夜躁欧美| 91精品国产三级| 日本不卡高清视频| 美女日批免费视频| 欧美激情aⅴ一区二区三区| 视频一区视频二区视频三区视频四区国产| 风间由美中文字幕在线看视频国产欧美| 国产日韩欧美综合| 精品欧美日韩精品| 茄子视频成人在线| 末成年女av片一区二区下载| 欧美日本啪啪无遮挡网站| 蜜桃视频网站在线| 国产亚洲精品一区二555| 午夜在线观看视频18| 精品国产一区久久| 国产毛片一区二区三区va在线 | 亚洲一级片网站| 久久久国产亚洲精品| 毛片在线视频播放| 日韩视频在线一区二区三区 | 18国产免费视频| 日韩欧美国产中文字幕| 日韩伦理在线视频| 亚洲大片免费看| 国产在线观看免费av| 亚洲精品国产一区二区精华液| 国产精品一区二区亚洲| 中文字幕乱码一区二区免费| x88av在线| 久久精品国产免费看久久精品| 成人免费视频久久| 视频一区国产视频| www.xxx亚洲| 人人狠狠综合久久亚洲| 男女无套免费视频网站动漫| 天堂久久一区二区三区| 妓院一钑片免看黄大片| 日韩高清不卡一区二区三区| 国产精品天天av精麻传媒| 日韩高清一区在线| 亚洲欧美日韩三级| 国产真实乱偷精品视频免| 在线观看视频你懂得| 国产精品 欧美精品| 精品人妻二区中文字幕| 岛国av在线一区| 变态另类丨国产精品| 国产清纯白嫩初高生在线观看91 | 日韩一区二区在线免费| 国产高清精品软男同| 欧美日韩国产成人精品| 水蜜桃色314在线观看| 香蕉久久a毛片| 国产精品亚洲天堂| 亚洲欧美一区在线| 国产96在线 | 亚洲| 亚洲欧美日韩国产一区| 亚洲高清在线免费观看| 国内成人自拍视频| 极品白嫩的小少妇| 久久奇米777| 久久国产美女视频| 天天综合天天综合色| 一级久久久久久| 欧美一区二区视频在线观看2022| 免费a级片在线观看| 亚洲欧美日本精品| 国产午夜精品久久久久免费视| 久久久久久亚洲| 素人啪啪色综合| 国产福利久久精品| 精品久久久久久久久久久下田| 国产日韩一区二区三区| 神马电影久久| 国产人妻人伦精品| 日韩中文字幕麻豆| 国内自拍偷拍视频| 国产亚洲精品久| 欧美日韩精品亚洲精品| 色又黄又爽网站www久久| 国产草草影院ccyycom| 亚洲欧美国产一本综合首页| 麻豆视频在线观看免费网站| 97不卡在线视频| 996久久国产精品线观看| 久久久久欧美| 中文在线日韩| 日本新janpanese乱熟| 成人精品免费看| 熟女少妇a性色生活片毛片| 精品久久久一区二区| 国产人妻精品一区二区三| 亚洲老头老太hd| 欧美寡妇性猛交xxx免费| 国产精品一区二区久久精品| 色婷婷狠狠五月综合天色拍 | 国语精品中文字幕| 亚洲精品电影| 男女啪啪网站视频| 99精品久久只有精品| 青青草成人免费| 欧美日韩激情一区二区三区| 亚州视频一区二区三区| 欧美精品在线免费播放| 91av一区| 噜噜噜噜噜久久久久久91| 欧美色综合网| 91日韩精品视频| 中文字幕不卡在线播放| 日日噜噜噜噜人人爽亚洲精品| 亚洲精品一区在线观看| 黄页视频在线播放| 国产一区二区香蕉| 成人毛片在线| 久久精品视频91| 久久色视频免费观看| 日韩少妇裸体做爰视频| 亚洲激情第一页| 国产白丝在线观看| 7777精品久久久久久| 欧洲大片精品免费永久看nba| 中文字幕欧美人与畜| 久久超级碰视频| 国产精品视频在| 欧美日韩黄视频| www.91在线| 国产精品一区二区性色av| 精品国产91| 波多结衣在线观看| 中文字幕高清一区| 亚洲最大成人av| 久久久国产在线视频| 麻豆精品国产| 成人在线视频一区二区三区| 国产成人激情av| 国产精久久久久久| 日韩精品有码在线观看| xx欧美xxx| 性欧美.com| 久久se精品一区二区| 欧美h片在线观看| 678五月天丁香亚洲综合网| 国产激情在线| 99影视tv| 午夜一区不卡| 亚洲av熟女国产一区二区性色| 在线免费观看日本欧美| √新版天堂资源在线资源| 国产一区私人高清影院| 国产精品v一区二区三区| 一边摸一边做爽的视频17国产| 欧美日韩性生活视频| 成人欧美一区| 成人信息集中地欧美| 国产精品黄色| 一级性生活毛片| 欧美人狂配大交3d怪物一区| 污网站在线免费看| 国产在线视频欧美一区二区三区| 老牛嫩草一区二区三区日本 | 91一区在线| 能看毛片的网站| 欧美性高潮在线| 免费观看在线午夜影视| 国产欧美日韩一区二区三区| 久久婷婷激情| 日韩成人毛片视频| 日韩电影中文字幕在线| 欧美成人福利| 丁香花在线影院观看在线播放| 国产午夜精品一区二区三区视频 | 精品成人久久久| 在线电影欧美日韩一区二区私密| 久久九九精品视频| 日本精品www| 亚洲精品国产无天堂网2021| 国产小视频免费在线观看| 成人在线一区二区| 性久久久久久| 国产免费久久久久| 亚洲欧美日韩第一区| 国产亚洲字幕| www.xxx亚洲| 亚洲成人中文在线| 男女啪啪在线观看| 欧美视频小说| 成人午夜电影小说| 国产一区二区在线播放视频| 欧美一级在线播放|