日期: 2023年9月30日
github 的清點物件演算法 - 阮一峰的網路日誌
使用 github 的時候,你有沒有見過下面的提示?
這段提示說,遠端**庫一共有4350078個物件需要轉殖。
這就叫"清點物件"(counting objects),github需要實時計算出來,需要轉殖的物件總數。
這個過程非常慢,根據github的披露,像linux kernel這樣巨大的庫,清點一次需要8分鐘!也就是說,發出git clone
命令後,會幹等八分鐘,然後才會開始真正的資料傳輸。這當然是無法忍受的。github團隊一直想解決這個問題。
後來,他們終於發現了一種新的演算法,現在清點一次只要3毫秒!
為了理解這個演算法,你必須先知道,什麼是git的物件。簡單說,物件就是檔案,最重要的物件有三種。
每次提交**的時候,會生成乙個commit物件,裡面有對應的當前"目錄物件"的名字。"目錄物件"儲存了**根目錄所含有的子目錄和檔案資訊。每乙個子目錄就是另乙個"目錄物件",每乙個檔案則是"檔案物件",裡面是具體的檔案內容。所以,"清點物件"就是清點各種commit、目錄、檔案等。
清點物件的原始演算法如下。
列出本地所有分支最新的乙個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功能了,因此將來肯定還會有更多好玩的用法出現。
(完)
sort演算法排序 std 生成排列物件的演算法
在刷oj online judge 題目的過程中,我們經常會遇到一類問題。題目的描述很簡單的 生成 字典順序 列出,如 迭代解決問題的基本思路是找出初始狀態和通用的形式重複的迭代子過程。對於這個問題,初始狀態已知,即 對於這個問題,我們不必重複造輪子,完全可以利用c 的algorithm libra...
github的使用步驟
1,首先登陸到 平台上註冊乙個自己的賬號。2,然後在左上部分輸入乙個開源專案的 名字,我選擇的是 jvalidator 回車搜尋。3,在搜尋結果頁面找到如下如圖所示的專案,單擊專案名稱。4,此時,你已經進入到了rinh jvalidator的專案主頁了,單擊右上角的 fork 按鈕,就把這個專案co...
Github的專案託管
github是全球最大的分布式版本控制系統。官網 自己安裝就行。安裝完成之後需要配置git,開啟安裝目錄下的git bash.exe,配置git使用者名稱和密碼 使用有意義的名字與email 輸入一下命令 git config global user.name 使用者名稱 git config gl...