日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Github 的清点对象算法

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Github 的清点对象算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://www.ruanyifeng.com/blog/2015/09/git-bitmap.html

使用 Github 的時候,你有沒有見過下面的提示?

$ git clone https://github.com/torvalds/linux Cloning into 'linux'... remote: Counting objects: 4350078, done. remote: Compressing objects: 100% (4677/4677), done. Receiving objects: 4% (191786/4350078), 78.19 MiB | 8.70 MiB/s

這段提示說,遠程代碼庫一共有4350078個對象需要克隆。

這就叫"清點對象"(counting objects),Github需要實時計算出來,需要克隆的對象總數。

這個過程非常慢,根據Github的披露,像Linux kernel這樣巨大的庫,清點一次需要8分鐘!也就是說,發出git clone命令后,會干等八分鐘,然后才會開始真正的數據傳輸。這當然是無法忍受的。Github團隊一直想解決這個問題。

后來,他們終于發現了一種新的算法,現在清點一次只要3毫秒!

為了理解這個算法,你必須先知道,什么是Git的對象。簡單說,對象就是文件,最重要的對象有三種。

  • 快照對象(Commit)
  • 目錄對象(Directory)
  • 文件對象(File)

每次提交代碼的時候,會生成一個commit對象,里面有對應的當前"目錄對象"的名字。"目錄對象"保存了代碼根目錄所含有的子目錄和文件信息。每一個子目錄就是另一個"目錄對象",每一個文件則是"文件對象",里面是具體的文件內容。

所以,"清點對象"就是清點各種commit、目錄、文件等。git clone和git fetch操作都需要清點對象,因為需要知道,到底下載哪些對象文件。

清點對象的原始算法如下。

  • 列出本地所有分支最新的一個commit
  • 列出遠程所有分支最新的一個commit
  • 兩者進行比較,只要有不同,就意味著分支發生變動
  • 每一個發生變動的commit,都清點其中具體變動的子目錄和文件
  • 追溯到當前commit的父節點,重復第四步,直至本地與遠程的歷史一致為止
  • 加總所有需要變動的對象
  • 上面的過程說明,"清點對象"是一個文件遍歷算法,變動的對象會被一一清點到,這就意味著大量的文件讀操作。對于大型代碼庫來說,這個過程非常慢。

    Github團隊想到的新算法,是建立一個Bitmap索引,即為每一個commit生成一個二進制值。

    打開本地Github倉庫的.git/objects/pack/目錄,你會看到一個索引文件和一個數據文件,它們就是Bitmap。簡單說,這兩個文件索引了當前代碼庫的所有對象,然后使用一個二進制值代表這些對象。有多少個對象,這個二進制值就有多少位。它的第n位,就代表數據文件里面的第n個對象。

    每個commit都會有一個對應的二進制值,表示當前快照包含的所有對象。這些對象對應的二進制位都為1,其他二進制位都為0。

    這樣做的好處是,不用讀取commit對象,只要讀取這個二進制值,就會知道當前commit包含了哪些節點。更妙的是,兩個二進制值只要做一次XOR運算,就會知道哪些位(即哪些對象)發生了變動。而且,因為新的對象總是添加到現有二進制位的后面,所以只要讀取多出來的那些位,就知道當前commit比上一次commit多出了哪些對象。

    這樣一來,"清點對象"就變成了二進制值的比較運算,因此速度極快。進一步的介紹,請參看官方文檔《Bitmap的解釋》,《Bitmap的格式》。

    目前,Github的生產環境已經部署了這套算法,用戶再也不用為了清點對象,而苦苦等待了。而且,Github團隊還把它合并進了Git,這意味著,從此所有Git實現都可以使用Bitmap功能了,因此將來肯定還會有更多好玩的用法出現。

    (完)

    總結

    以上是生活随笔為你收集整理的Github 的清点对象算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。