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

源碼解析:Git的第一個(gè)提交是什么樣的?

開發(fā) 開發(fā)工具
Git 本身亦是一個(gè)成熟并處于活躍開發(fā)狀態(tài)的開源項(xiàng)目,今天驚人數(shù)量的軟件項(xiàng)目依賴 Git 進(jìn)行版本管理,這些項(xiàng)目包括開源以及各種商業(yè)軟件。

[[342934]]

 前言

Git 是目前世界上被最廣泛使用的現(xiàn)代軟件版本管理系統(tǒng)(Version Control System)。Git 本身亦是一個(gè)成熟并處于活躍開發(fā)狀態(tài)的開源項(xiàng)目,今天驚人數(shù)量的軟件項(xiàng)目依賴 Git 進(jìn)行版本管理,這些項(xiàng)目包括開源以及各種商業(yè)軟件。Git 在職業(yè)軟件開發(fā)者中擁有良好的聲譽(yù),Git 目前支持絕大多數(shù)的操作系統(tǒng)以及 IDE(Integrated Development Environments)。

Git 最初是由 Linux 操作系統(tǒng)內(nèi)核的創(chuàng)造者 Linus Torvalds 在 2005 年創(chuàng)造,Git 第一個(gè)可用版本是 Linus 花了兩周時(shí)間用C寫出來的。Git 第一個(gè)版本就實(shí)現(xiàn)了 Git 源碼自托管,一個(gè)月之內(nèi),Linux系統(tǒng)的源碼也已經(jīng)由 Git 管理了!

Git 的第一個(gè)提交源碼僅有約1000行,但是已經(jīng)實(shí)現(xiàn)了Git的基本設(shè)計(jì)原理,比如初始化倉庫、提交代碼、查看代碼diff、讀取提交信息等,Git 定義了三個(gè)區(qū):工作區(qū)(workspace)、暫存區(qū)(index)、版本庫(commit history),也實(shí)現(xiàn)了三類重要的 Git 對象:blob、tree、commit。本文將從源碼上分析 Git 的第一個(gè)提交并挖掘背后優(yōu)秀的設(shè)計(jì)原理。

編譯

獲取源碼

在Github上可以找到Git的倉庫鏡像:https://github.com/git/git.git

  1. # 獲取 git 源碼 
  2. $ git clone https://github.com/git/git.git 
  3.  
  4. # 查看第一個(gè)提交 
  5. $ git log --date-order --reverse 
  6. commit e83c5163316f89bfbde7d9ab23ca2e25604af290 
  7. Author: Linus Torvalds <torvalds@ppc970.osdl.org> 
  8. Date:   Thu Apr 7 15:13:13 2005 -0700 
  9.  
  10.     Initial revision of "git", the information manager from hell 
  11.  
  12. # 變更為第一個(gè)提交,指定commit-id 
  13. $ git reset --hard e83c5163316f89bfbde7d9ab23ca2e25604af290 

文件結(jié)構(gòu)

  1. $ tree -h 
  2. ├── [2.4K]  cache.h 
  3. ├── [ 503]  cat-file.c                  # 查看objects文件 
  4. ├── [4.0K]  commit-tree.c               # 提交tree 
  5. ├── [1.2K]  init-db.c                   # 初始化倉庫 
  6. ├── [ 970]  Makefile 
  7. ├── [5.5K]  read-cache.c                # 讀取當(dāng)前索引文件內(nèi)容 
  8. ├── [8.2K]  README 
  9. ├── [ 986]  read-tree.c                 # 讀取tree 
  10. ├── [2.0K]  show-diff.c                 # 查看diff內(nèi)容 
  11. ├── [5.3K]  update-cache.c              # 添加文件或目錄 
  12. └── [1.4K]  write-tree.c                # 寫入到tree 
  13.  
  14. # 統(tǒng)計(jì)代碼行數(shù),總共1089行 
  15. $ find . "(" -name "*.c" -or -name "*.h" -or -name "Makefile" ")" -print | xargs wc -l 
  16.  ... 
  17.  1089 total 

編譯

編譯第一個(gè)提交的Git會(huì)有編譯問題,需要更改Makefile添加相關(guān)的依賴庫:

  1. $ git diff ./Makefile 
  2. ...  
  3. -LIBS= -lssl 
  4. +LIBS= -lssl -lz -lcrypto 
  5. ... 

編譯:

  1. # 編譯 
  2. $ make 

只支持在 linux 平臺(tái)上編譯運(yùn)行。

源碼分析

Write programs that do one thing and do it well. ——Unix philosophy

查看編譯生成的可執(zhí)行文件,總共有7個(gè):


命令使用過程:


init-db:初始化倉庫

命令說明

  1. $ init-db 

運(yùn)行流程

創(chuàng)建目錄:.dircache。

創(chuàng)建目錄:.dircache/objects。

在 .dircache/objects 中創(chuàng)建了從 00 ~ ff 共256個(gè)目錄。

.dircache/ 是Git的工作目錄,最新版本的Git工作目錄為 .git/ 。

運(yùn)行示例

  1. # 運(yùn)行init-db初始化倉庫 
  2. $ init-db 
  3. defaulting to private storage area 
  4.  
  5. # 查看初始化后的目錄結(jié)構(gòu) 
  6. $ tree . -a 
  7. └── .dircache                   # git工作目錄 
  8.     └── objects                 # objects文件 
  9.         ├── 00 
  10.         ├── 01 
  11.         ├── 02 
  12.         ├── ......              # 省略 
  13.         ├── fe 
  14.         └── ff 
  15. 258 directories, 0 files 

最新版本Git使用 git init . 初始化倉庫,而且初始化工作目錄為 .git/,初始化后,.git/ 目錄中的文件和功能也非常豐富,包括 .git/HEAD、.git/refs/ 、.git/info/ 等,以及很多的 hooks 示例:.git/hooks/**.sample。

update-cache:添加文件或目錄

update-cache 主要是把工作區(qū)的修改文件提交到暫存區(qū)。工作區(qū)、暫存區(qū)等說明見下文【設(shè)計(jì)原理】 。

命令使用

  1. update-cache ... 

運(yùn)行流程

  1. 讀取并解析索引文件 :.dircache/index。
  2. 遍歷多個(gè)文件,讀取并生成變更文件信息(文件名稱、文件內(nèi)容sha1值、日期、大小等),寫入到索引文件中。
  3. 遍歷多個(gè)文件,讀取并壓縮變更文件,存儲(chǔ)到objects文件中,該文件為blob對象。

如果是剛初始化的倉庫,會(huì)自動(dòng)創(chuàng)建索引文件。索引文件說明見下文【設(shè)計(jì)原理 - 索引文件】。blob對象的文件格式及說明見下文【設(shè)計(jì)原理 - blob對象】。sha1值說明見下文【設(shè)計(jì)原理 - 哈希算法】。

運(yùn)行示例

  1. # 新增README.md文件 
  2. $ echo "hello git" > README.md 
  3.  
  4. # 提交 
  5. update-cache README.md 
  6.  
  7. # 查看索引文件 
  8. $ hexdump -C .dircache/index 
  9. 00000000  43 52 49 44 01 00 00 00  01 00 00 00 af a4 fc 8e  |CRID............| 
  10. 00000010  5e 34 9d dd 31 8b 4c 8e  15 ca 32 05 5A e9 a4 c8  |^4..1.L...2.Z...| 
  11. 00000020  af bd 4c 5f bf fb 41 37  af bd 4c 5f bf fb 41 37  |..L_..A7..L_..A7| 
  12. 00000030  00 03 01 00 91 16 d2 04  b4 81 00 00 ee 03 00 00  |................| 
  13. 00000040  ee 03 00 00 0a 00 00 00  bb 12 25 52 ab 7b 40 20  |..........%R.{@ | 
  14. 00000050  b5 f6 12 cc 3b bd d5 b4  3d 1f d3 a8 09 00 52 45  |....;...=.....RE| 
  15. 00000060  41 44 4d 45 2e 6d 64 00                           |ADME.md.| 
  16. 00000068 
  17.  
  18. # 查看objects內(nèi)容,sha1值從索引文件中獲取 
  19. $ cat-file bb122552ab7b4020b5f612cc3bbdd5b43d1fd3a8 
  20. temp_git_file_61uTTP: blob 
  21. $ cat ./temp_git_file_RwpU8b 
  22. hello git 

cat-file:查看objects文件內(nèi)容

cat-file 根據(jù)sha1值查看暫存區(qū)中的objects文件內(nèi)容。cat-file 是一個(gè)輔助工具,在正常的開發(fā)工作流中一般不會(huì)使用到。

命令使用

 

  1. $ cat-file <sha1> 

運(yùn)行流程

  1. 根據(jù)入?yún)ha1值定位objects文件,比如.dircache/objects/46/4b392e2c8c7d2d13d90e6916e6d41defe8bb6a
  2. 讀取該objects文件內(nèi)容,解壓得到真實(shí)數(shù)據(jù)。
  3. 寫入到臨時(shí)文件 temp_git_file_XXXXXX(隨機(jī)不重復(fù)文件)。

objects內(nèi)容為壓縮格式,基于zlib壓縮算法,objects說明見【設(shè)計(jì)原理 - objects 文件】。

運(yùn)行示例

  1. # cat-file 會(huì)把內(nèi)容讀取到temp_git_file_rLcGKX 
  2. $ cat-file 82f8604c3652fa5762899b5ff73eb37bef2da795 
  3. temp_git_file_tBTXFM: blob 
  4.  
  5. # 查看 temp_git_file_tBTXFM 文件內(nèi)容 
  6. $ cat ./temp_git_file_tBTXFM  
  7. hello git! 

show-diff:查看diff內(nèi)容

查看工作區(qū)和暫存區(qū)中的文件差異。

命令使用

  1. $ show-diff 

運(yùn)行流程

讀取并解析索引文件:.dircache/index。

循環(huán)遍歷變更文件信息,比較工作區(qū)中的文件信息和索引文件中記錄的文件信息差異。

無差異,顯示 : ok。

有差異,調(diào)用 diff 命令輸出差異內(nèi)容。

運(yùn)行示例

  1. # 創(chuàng)建文件并提交到暫存區(qū) 
  2. $ echo "hello git!" > README.md 
  3. update-cache README.md 
  4.  
  5. # 當(dāng)前無差異 
  6. $ show-diff 
  7. README.md: ok 
  8.  
  9. # 更改README.md 
  10. $ echo "hello world!" > README.md 
  11.  
  12. # 查看diff 
  13. $ show-diff 
  14. README.md:  82f8604c3652fa5762899b5ff73eb37bef2da795 
  15. --- -   2020-08-31 17:33:50.047881667 +0800 
  16. +++ README.md   2020-08-31 17:33:47.827740680 +0800 
  17. @@ -1 +1 @@ 
  18. -hello git! 
  19. +hello world! 

write-tree:寫入到tree

write-tree 作用將保存在索引文件中的多個(gè)objects對象歸并到一個(gè)類型為tree的objects文件中,該文件即Git中重要的對象:tree。

命令使用

  1. $ write-tree 

運(yùn)行流程

  1. 讀取并解析索引文件:.dircache/index。
  2. 循環(huán)遍歷變更文件信息,按照指定格式編排變更文件信息及內(nèi)容。
  3. 壓縮并存儲(chǔ)到objects文件中,該object文件為tree對象。

tree對象的文件格式及相關(guān)說明見下文【設(shè)計(jì)原理 - tree對象】。

運(yùn)行示例

  1. # 提交 
  2. $ write-tree 
  3. c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  4.  
  5. # 查看objects內(nèi)容 
  6. $ cat-file  c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  7. temp_git_file_r90ft5: tree 
  8. $ cat ./temp_git_file_r90ft5 
  9. 100664 README.md��`L6R�Wb��_�>�{�-�� 

read-tree:讀取tree

read-tree 讀取并解析指定sha1值的tree對象,輸出變更文件的信息。

命令使用

 

  1. read-tree <sha1> 

運(yùn)行步驟

  1. 解析sha1值。
  2. 讀取對應(yīng)sha1值的object對象。
  3. 輸出變更文件的屬性、路徑、sha1值。

運(yùn)行示例

  1. # 提交 
  2. $ write-tree 
  3. c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  4.  
  5. # 讀取tree對象 
  6. read-tree  c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  7. 100664 README.md (82f8604c3652fa5762899b5ff73eb37bef2da795) 

commit-tree:提交tree

commit-tree 把本地變更提交到版本庫里,具體是基于一個(gè)tree對象的sha1值創(chuàng)建一個(gè)commit對象。

命令使用

  1. commit-tree <sha1> [-p <sha1>]* < changelog 

運(yùn)行流程

  1. 參數(shù)解析。
  2. 獲取用戶名稱、用戶郵件、提交日期。
  3. 寫入tree信息。
  4. 寫入parent信息。
  5. 寫入author、commiter信息。
  6. 寫入comments(注釋)。
  7. 壓縮并存儲(chǔ)到objects文件中,該object文件為commit對象。

commit對象的文件格式及說明見下文【設(shè)計(jì)原理 - commit對象】。

運(yùn)行示例

  1. # 寫入到tree 
  2. $ write-tree  
  3. c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  4.  
  5. # 提交tree 
  6. $ echo "first commit" > changelog 
  7. commit-tree c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 < changelog 
  8. Committing initial tree c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  9. 7ea820bd363e24f5daa5de8028d77d88260503d9 
  10.  
  11. # 查看commit對象內(nèi)容 
  12. $ cat-file 7ea820bd363e24f5daa5de8028d77d88260503d9 
  13. temp_git_file_CIfJsg: commit 
  14. $ cat temp_git_file_CIfJsg 
  15. tree c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  16. author Xiaowen Xia <chenan.xxw@aos-hw09> Tue Sep  1 10:56:16 2020 
  17. committer Xiaowen Xia <chenan.xxw@aos-hw09> Tue Sep  1 10:56:16 2020 
  18.  
  19. first commit 

設(shè)計(jì)原理

Write programs to work together.

——Unix philosophy

與傳統(tǒng)的集中式版本控制系統(tǒng)(CVCS)相反,Git 從一開始就設(shè)計(jì)成了去中心化的分布式系統(tǒng),每個(gè)開發(fā)者本地工作區(qū)都是一個(gè)完整的版本庫,擁有本地的代碼倉庫。另外,Git 的設(shè)計(jì)初衷是為了讓更多的開發(fā)者一起開發(fā)軟件。

該版本 Git 定義了三種對象:

  • blob 對象:保存著文件快照。
  • tree 對象:記錄著目錄結(jié)構(gòu)和 blob 對象索引。
  • commit 對象:包含著指向前述 tree 對象的指針和所有提交信息。

三種對象相互之間的關(guān)系如下:


 

圖源:https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell

另外,Git 也定義了三個(gè)區(qū),工作區(qū)(workspace),暫存區(qū)(index)和版本庫(commit history):

  • 工作區(qū)(workspace):我們直接修改代碼的地方。
  • 暫存區(qū)(index):數(shù)據(jù)暫時(shí)存放的區(qū)域,用于在工作區(qū)和版本庫之間進(jìn)行數(shù)據(jù)交流。
  • 版本庫(commit history):存放已經(jīng)提交的數(shù)據(jù)。

每個(gè)可執(zhí)行文件的具體分工是:init-db 用來創(chuàng)建一個(gè)初始化倉庫,update-cache 會(huì)將 工作區(qū) 的變更寫到 索引文件 (index)中,write-tree 會(huì)將之前的所有變更整理成 tree 對象,commit-tree 會(huì)將 指定的 tree 對象寫到本地版本庫中。另外,show-diff 用來查看 工作區(qū) 和 暫存區(qū) 中的文件差異,read-tree 用來讀取 tree對象 的信息。

由此可以繪制一個(gè)簡單的Git開發(fā)工作流:

objects 文件

objects文件是載體,用來存儲(chǔ)Git中的3個(gè)重要對象:blob、tree、commit。

  1. $ tree .git/objects 
  2. .git/objects 
  3. ├── 02 
  4. │   └── 77ec89d7ba8c46a16d86f219b21cfe09a611e1 
  5. ├── ......                                          # 省略 
  6. ├── be 
  7. │   ├── adb5bac00c74c97da7f471905Ab0da8b50229c 
  8. │   └── ee7b5e8ab6ae1c0c1f3cfa2c4643aacdb30b9b 
  9. ├── ......                                          # 省略 
  10. ├── c9 
  11. │   └── f6098f3ba06cf96e1248e9f39270883ba0e82e 
  12. ├── ......                                          # 省略 
  13. ├── cf 
  14. │   ├── 631abbf3c4cec0911cb60cc307f3dce4f7a000 
  15. │   └── 9e478ab3fc98680684cc7090e84644363a4054 
  16. ├── ......                                          # 省略 
  17. └── ff 

為了節(jié)約存儲(chǔ),同時(shí)也能存儲(chǔ)多個(gè)信息,objects文件內(nèi)容都是經(jīng)過 zlib 壓縮過的。objects文件的格式由 + + <要存儲(chǔ)的內(nèi)容> 組成,其中 可以是"blob"(blob對象)、"tree"(tree對象)、"commit"(commit對象)。

使用 cat-file 可以查看object文件是什么類型的對象。

.dircache/objects 目錄結(jié)構(gòu)如下:

$ tree .git/objects.git/objects├── 02│ └── 77ec89d7ba8c46a16d86f219b21cfe09a611e1├── ...... # 省略├── be│ ├── adb5bac00c74c97da7f471905Ab0da8b50229c│ └── ee7b5e8ab6ae1c0c1f3cfa2c4643aacdb30b9b├── ...... # 省略├── c9│ └── f6098f3ba06cf96e1248e9f39270883ba0e82e├── ...... # 省略├── cf│ ├── 631abbf3c4cec0911cb60cc307f3dce4f7a000│ └── 9e478ab3fc98680684cc7090e84644363a4054├── ...... # 省略└── ff

問:為什么 .dircache/objects/ 目錄下面要以sha1值前一個(gè)字節(jié)的hex值作為子目錄?

blob 對象

運(yùn)行 update-cache 會(huì)生成 blob 對象。

blob 對象用于存儲(chǔ)變更文件內(nèi)容,其實(shí)就代表一個(gè)變更文件快照。blob 對象由 + + 拼裝并壓縮:

使用 cat-file 查看 blob 對象內(nèi)容:

  1. # 查看 blob 對象內(nèi)容 
  2. $ cat-file 82f8604c3652fa5762899b5ff73eb37bef2da795temp_git_file_tBTXFM: blob 
  3.  
  4. $ cat ./temp_git_file_tBTXFM  
  5. hello git! 

tree 對象

運(yùn)行 write-tree 會(huì)生成 tree 對象。

tree 對象用于存儲(chǔ)多個(gè)提交文件的信息。tree 對象由 + + 文件模式 + 文件名稱 + 文件sha1值 拼裝并壓縮:

文件sha1值 使用binary格式存儲(chǔ),占用20字節(jié)。

使用 cat-file 查看 tree 對象內(nèi)容:

  1. # 查看 tree 對象內(nèi)容 
  2. $ cat-file  c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  3. temp_git_file_r90ft5: tree 
  4.  
  5. $ cat ./temp_git_file_r90ft5 
  6. 100664 README.md��`L6R�Wb��_�>�{�-�� 

文件sha1值 使用binary格式存儲(chǔ),所以打印的時(shí)候會(huì)有亂碼。

commit 對象

運(yùn)行 commit-tree 會(huì)生成 commit 對象。

commit 對象存儲(chǔ)一次提交的信息,包括所在的tree信息,parent信息以及提交的作者等信息。commit 對象由 + +

tree sha1值 和 parent sha1值 使用hex字符串格式存儲(chǔ),占用40字節(jié)。

使用 cat-file 查看 commit 對象內(nèi)容:

  1. # 查看 commit 對象內(nèi)容 
  2. $ cat-file 7ea820bd363e24f5daa5de8028d77d88260503d9 
  3. temp_git_file_CIfJsg: commit 
  4.  
  5. $ cat temp_git_file_CIfJsg 
  6. tree c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 
  7. author Xiaowen Xia <chenan.xxw@aos-hw09> Tue Sep  1 10:56:16 2020 
  8. committer Xiaowen Xia <chenan.xxw@aos-hw09> Tue Sep  1 10:56:16 2020 
  9.  
  10. first commit 

索引文件

索引文件默認(rèn)路徑為:.dircache/index。索引文件用來存儲(chǔ)變更文件的相關(guān)信息,當(dāng)運(yùn)行 update-cache 時(shí)會(huì)添加變更文件的信息到索引文件中。

同時(shí)也有一個(gè)叫 .dircache/index.lock 的文件,該文件存在時(shí)表示當(dāng)前工作區(qū)被鎖定,無法進(jìn)行提交操作。

使用 hexdump 命令可以查看到索引文件內(nèi)容:

  1. $ hexdump -C .dircache/index  
  2. 00000000  43 52 49 44 01 00 00 00  01 00 00 00 ae 73 c4 f2  |CRID.........s..| 
  3. 00000010  ce 32 c9 6f 13 20 0d 56  9c e8 cf 0d d3 75 10 c8  |.2.o. .V.....u..| 
  4. 00000020  94 ad 4c 5f f4 5c 42 06  94 ad 4c 5f f4 5c 42 06  |..L_.\B...L_.\B.| 
  5. 00000030  00 03 01 00 91 16 d2 04  b4 81 00 00 ee 03 00 00  |................| 
  6. 00000040  ee 03 00 00 0b 00 00 00  a3 f4 a0 66 c5 46 39 78  |...........f.F9x| 
  7. 00000050  1e 30 19 a3 20 42 e3 82  84 ee 31 54 09 00 52 45  |.0.. B....1T..RE| 
  8. 00000060  41 44 4d 45 2e 6d 64 00                           |ADME.md.| 

.dircache/index 索引文件使用二進(jìn)制存儲(chǔ)相關(guān)內(nèi)容,該文件由 文件頭 + 變更文件信息 組成:

 

 

文件頭大小為32字節(jié),一個(gè)變更文件信息大小至少是63字節(jié)。其中:文件頭中的sha1值由整個(gè)索引文件內(nèi)容(文件頭 + 變更文件信息)計(jì)算得到的。變更文件信息的sha1值由變更文件內(nèi)容(壓縮后)計(jì)算得到的。

哈希算法

該 Git 版本中使用的哈希算法為 sha1算法 ,代碼中使用的是 OpenSSL 庫中提供的sha1算法。

目前 Git 已經(jīng)有了新的選擇:sha256算法 ,且目前正在做 sha1 到 sha256 的遷移。

  1. #include <openssl/sha.h> 
  2.  
  3. static int verify_hdr(struct cache_header *hdr, unsigned long size
  4.   SHA_CTX c; 
  5.   unsigned char sha1[20]; 
  6.         /* 省略 */ 
  7.   /* 計(jì)算索引文件頭sha1值 */ 
  8.   SHA1_Init(&c); 
  9.   SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1)); 
  10.   SHA1_Update(&c, hdr+1, size - sizeof(*hdr)); 
  11.   SHA1_Final(sha1, &c); 
  12.   /* 省略 */ 
  13.   return 0; 

總結(jié)與思考

Use software leverage to your advantage. ——Unix philosophy

好的代碼不是寫出來的,是改出來的

Git 的第一個(gè)提交中,雖然實(shí)現(xiàn)了 Git 的分布式核心思想,以及三種對象,三個(gè)區(qū)等核心概念,但是 Git 的靈魂功能比如分支策略、遠(yuǎn)程倉庫、日志系統(tǒng)、git hooks 等功能都是后面逐步迭代出來的。

關(guān)于細(xì)節(jié)

問:為什么 .dircache/objects/ 目錄下面要以 sha1 值前一個(gè)字節(jié)的 hex 值作為子目錄?

答:ext3 文件系統(tǒng)下,一個(gè)目錄下只能有 32000 個(gè)一級(jí)子文件,如果都把 objects 文件存儲(chǔ)到一個(gè) .git/objects/ 目錄里,很大概率會(huì)達(dá)到上限。同時(shí)要是一個(gè)目錄下面子文件太多,那文件查找效率會(huì)降低很多。

關(guān)于代碼質(zhì)量

Git 的第一次提交源碼,從代碼質(zhì)量、數(shù)據(jù)結(jié)構(gòu)上看其實(shí)并沒有多少參考價(jià)值,反而我還發(fā)現(xiàn)了很多可以優(yōu)化的地方,比如:

  • 異常處理不完善,經(jīng)常出現(xiàn)段錯(cuò)誤(SegmentFault)。
  • 存在幾處內(nèi)存泄漏的地方,比如 write-tree.c > main函數(shù) > buffer內(nèi)存塊 。
  • 從索引文件中讀取到的變更文件信息使用數(shù)組存儲(chǔ),涉及到了比較多的申請釋放操作,性能上是有損失的,可以優(yōu)化成鏈表存儲(chǔ)。

不過這些都不重要,重要的是 Git 的設(shè)計(jì)原理和思想。

【本文為51CTO專欄作者“阿里巴巴官方技術(shù)”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2020-04-24 10:02:44

組件Vue組件庫

2025-05-19 00:00:00

Git代碼自動(dòng)化

2016-08-05 12:58:44

GitLinux開源

2018-10-15 10:10:41

Linux內(nèi)核補(bǔ)丁

2022-07-21 07:09:21

React前端項(xiàng)目

2022-02-15 10:45:50

軟件汽車開發(fā)

2010-07-30 14:58:06

Flex應(yīng)用

2018-01-05 08:54:09

加固型數(shù)據(jù)中心業(yè)務(wù)

2022-10-30 15:03:25

人工智能倉庫管理機(jī)器人

2017-07-27 16:25:54

云管理公共云合并

2017-12-17 16:53:27

云計(jì)算亞馬遜云端

2014-02-17 17:18:00

程序員

2013-02-27 10:53:16

開源KVM

2013-01-31 11:51:37

開源KVM

2016-12-07 18:10:08

邊緣計(jì)算

2012-08-24 10:46:12

程序員

2015-04-08 10:40:09

2024-06-27 08:55:41

2020-07-15 07:57:17

代碼Vue開發(fā)

2020-07-14 14:50:44

Vue代碼前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美久色视频| 自拍网站在线观看| 成人av资源网站| 日本伊人精品一区二区三区介绍| 国产综合精品在线| 国产精品一区二区三区四区在线观看 | 看看黄色一级片| 欧洲黄色一区| 久久免费视频一区| 91久久精品国产| 中文字幕亚洲高清| 国产精品久久观看| 亚洲男人av电影| 91亚洲一区二区| 国产免费不卡| 亚洲最色的网站| 亚洲国产高清国产精品| 可以免费观看的毛片| 免费av成人在线| 78m国产成人精品视频| 国产激情无码一区二区三区| 奇米影视777在线欧美电影观看| 欧美精三区欧美精三区| 黄色片视频在线免费观看| a毛片在线看免费观看| 国产日本亚洲高清| 国产精品三区www17con| 一区二区的视频| 三级久久三级久久久| 91国产视频在线| 深夜福利影院在线观看| 久久网站免费观看| 亚洲免费视频观看| 香蕉久久久久久av成人| 国产精品国产三级在线观看| 欧美自拍丝袜亚洲| 日韩在线综合网| 男女在线观看视频| 国产精品九色蝌蚪自拍| 日本不卡在线观看| 亚洲欧美日韩精品永久在线| 粉嫩蜜臀av国产精品网站| 国产一区视频在线| 在线播放国产一区| 欧美a一区二区| 浅井舞香一区二区| 日产精品久久久| 亚洲国产二区| 97精品一区二区三区| 精品视频在线观看免费| 综合天堂av久久久久久久| 日日噜噜噜夜夜爽亚洲精品| 成年人在线免费看片| 国产成人1区| 一本色道久久综合狠狠躁篇怎么玩| 欧美亚一区二区三区| 网红女主播少妇精品视频| 亚洲国产精品一区二区久| 国产精品扒开腿做爽爽爽a片唱戏| 精品一区二区三区中文字幕在线| 欧美高清视频在线高清观看mv色露露十八| 天堂在线资源视频| 亚洲成人人体| 欧美三区免费完整视频在线观看| 91最新在线观看| 精品久久99| 欧美一区二区美女| 黑人无套内谢中国美女| 粉嫩精品导航导航| 亚洲精品97久久| 双性尿奴穿贞c带憋尿| 要久久爱电视剧全集完整观看| 日韩电视剧免费观看网站| 91久久免费视频| 久久国产精品成人免费观看的软件| 日韩中文在线视频| 少妇人妻丰满做爰xxx| 正在播放日韩欧美一页| 性亚洲最疯狂xxxx高清| 黄色在线免费观看| 老司机精品视频导航| 亚洲自拍偷拍网址| 日韩一区二区三区不卡| 国产亚洲短视频| 中文字幕99| 操喷在线视频| 91久久精品一区二区三区| 欧美一级xxxx| 国内精品国产成人国产三级粉色| 亚洲无线码在线一区观看| 亚洲女人久久久| 黄色日韩在线| 国产精品久久久久久久美男| www.av黄色| 久久久久高清精品| 综合网五月天| 精精国产xxxx视频在线野外| 欧美性大战xxxxx久久久| 黑人无套内谢中国美女| 国产亚洲一卡2卡3卡4卡新区| 久久国产精品久久国产精品| 伊人中文字幕在线观看| 国产一区在线不卡| 久久另类ts人妖一区二区| 五月天婷婷在线视频| 亚洲高清中文字幕| 欧美在线aaa| 欧美成人基地| 久久精品小视频| 日本道在线观看| 国产精品一区二区在线看| 日本日本精品二区免费| 日本电影在线观看| 欧美三级三级三级| 日本xxx在线播放| 午夜视频一区| 国产精品稀缺呦系列在线| 天天操天天操天天操| 亚洲欧美一区二区视频| 国模吧无码一区二区三区| 动漫一区二区三区| 国产一区二区三区视频在线观看| 久久中文字幕无码| 精品一区二区三区的国产在线播放| 蜜桃91精品入口| 欧美韩日亚洲| 91精品在线一区二区| 中文字幕免费高清| 亚洲作爱视频| 成人国产1314www色视频| 欧美精品videos另类| 一本大道久久a久久综合婷婷| 在线播放第一页| 亚洲一区在线| 国产日韩在线视频| 91在线视频| 在线影院国内精品| 欧美图片第一页| 性xx色xx综合久久久xx| 国产精品区二区三区日本| 中文在线观看免费| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲精品中文字幕女同| 豆国产97在线 | 亚洲| 国产精品夜夜嗨| 久久视频免费在线| 成人97精品毛片免费看| 日韩视频―中文字幕| 在线播放国产一区| 国产精品久久免费看| 欧美婷婷精品激情| 日韩av自拍| 国产女精品视频网站免费| yw193.com尤物在线| 色8久久精品久久久久久蜜| 久久只有这里有精品| 亚久久调教视频| 欧美精品123| 亚洲成a人片| 中文字幕国产精品| 国产乱人乱偷精品视频| 亚洲免费伊人电影| 一级黄色电影片| 亚洲大黄网站| 鲁鲁视频www一区二区| 亚洲最大网站| 色小说视频一区| 国产人妖一区二区| 亚洲网友自拍偷拍| 久久人人爽人人爽人人片| 首页综合国产亚洲丝袜| 夜夜爽99久久国产综合精品女不卡| 久久三级毛片| 欧美大秀在线观看| 少妇无码一区二区三区| 精品av在线播放| 免费黄色在线网址| 国产精品18久久久久久久久久久久 | 日韩欧美电影在线观看| 一本久久a久久免费精品不卡| 1024手机在线观看你懂的| 国产专区综合网| 久久视频这里有精品| 精品国产精品国产偷麻豆| 国产啪精品视频网站| av电影在线地址| 亚洲欧洲av一区二区| 11024精品一区二区三区日韩| 亚洲免费观看高清完整| 中国一级特黄录像播放| 蜜臀国产一区二区三区在线播放| 青青视频免费在线观看| 欧美成人专区| 成人中文字幕+乱码+中文字幕| free性欧美| 少妇高潮久久77777| 女人18毛片水真多18精品| 欧美亚洲自拍偷拍| 欧美黄色免费看| 中文字幕不卡的av| 精品无码av一区二区三区| 青青草精品视频| 激情五月婷婷六月| 日韩av大片| 久久亚洲国产精品日日av夜夜| 狠狠久久伊人中文字幕| 81精品国产乱码久久久久久| 毛片在线看网站| 亚洲欧美三级伦理| 午夜精品一区二区三| 欧美日韩国产一区| 特黄视频免费看| 亚洲国产裸拍裸体视频在线观看乱了| 欧美性受xxxx黑人| 972aa.com艺术欧美| 亚洲欧美日韩中文字幕在线观看| 日韩高清在线不卡| av在线播放亚洲| 欧美福利专区| 最新欧美日韩亚洲| 成人免费a**址| 久久艳妇乳肉豪妇荡乳av| 秋霞一区二区| 成人精品视频在线| 在线国产成人影院| 日本韩国在线不卡| av福利导福航大全在线| 欧美激情按摩在线| 成人片在线看| 日韩在线观看免费| 成人资源www网在线最新版| 精品呦交小u女在线| 黄色一级大片在线免费看国产一| 日韩欧美自拍偷拍| 97人妻精品一区二区三区| 一本到不卡精品视频在线观看| 日韩精品成人一区| 精品成人久久av| 日本三级视频在线| 婷婷成人激情在线网| 精品无码m3u8在线观看| 亚洲一区视频在线观看视频| 黄色一级片在线免费观看| 亚洲精品欧美在线| 99久久婷婷国产综合| 亚洲精品免费在线| 超碰手机在线观看| 亚洲视频一二区| 国产av无码专区亚洲av毛网站| 亚洲欧美色一区| 国产精品视频一区二区三| 一区二区视频在线| 精品无码人妻一区二区三区品| 一片黄亚洲嫩模| 国产第一页在线播放| 亚洲一二三区在线观看| 日韩美女一级片| 丰满岳妇乱一区二区三区| 五月天婷婷激情| 欧美色中文字幕| 国产普通话bbwbbwbbw| 7878成人国产在线观看| 欧美激情影音先锋| 国严精品久久久久久亚洲影视| 国产一区再线| 国产黄色片免费观看| 日本在线不卡视频一二三区| 椎名由奈jux491在线播放| 亚洲一本二本| 亚洲国产精品成人天堂| 国产农村妇女精品一区二区| 国产福利一区视频| 久久99精品久久久久| 欧美视频亚洲图片| 国产iv一区二区三区| 泷泽萝拉在线播放| 国产精品国产三级国产aⅴ中文 | 澳门精品久久国产| 精品久久久三级| 人人狠狠综合久久亚洲婷婷| 在线观看成人免费| 国产一区二区三区的电影 | 欧美影院视频| 国内精品二区| 成人av二区| 人妻激情另类乱人伦人妻| 免费在线观看成人av| 亚洲另类第一页| 北岛玲一区二区三区四区| xxxx日本黄色| 亚洲最大成人综合| 日韩在线播放中文字幕| 日韩一级精品视频在线观看| 免费一级毛片在线观看| 久久精品视频播放| 最近高清中文在线字幕在线观看1| 成人激情综合网| 亚洲第一论坛sis| 日韩视频在线观看视频| 国产欧美日韩一区二区三区在线| 亚洲 激情 在线| 99精品欧美一区二区三区综合在线| 一区二区三区在线播放视频| 精品久久久久久久久久| 国产精品国产一区二区三区四区 | 在线观看日本中文字幕| 亚洲猫色日本管| 色老头在线视频| 亚洲激情成人网| 国产网站在线免费观看| 日韩av片永久免费网站| xxxx日韩| 一区二区三区日韩视频| 爽好多水快深点欧美视频| 男人网站在线观看| 亚洲欧洲中文日韩久久av乱码| 亚洲乱码国产乱码精品| 亚洲福利视频网| 直接在线观看的三级网址| 国产欧美日韩高清| 亚州精品视频| 国产午夜大地久久| 国产福利精品一区| 女性裸体视频网站| 欧美天堂一区二区三区| 欧美日韩国产中文字幕在线| 国模精品视频一区二区| 人人九九精品视频| 国产大尺度在线观看| 久久精品国产第一区二区三区| 在线精品一区二区三区| 一区二区三区高清在线| 国产视频手机在线观看| 久久精品91久久久久久再现| 福利一区和二区| 日本在线观看一区二区三区| 美女91精品| 国产 欧美 在线| 日本黄色一区二区| 久久精品国产亚洲a∨麻豆| 91成人国产在线观看| 激情小说亚洲图片| 久草热视频在线观看| 波波电影院一区二区三区| 国产在线成人精品午夜| 亚洲成人a**站| 狼人综合视频| 免费毛片一区二区三区久久久| 一本色道久久综合亚洲精品高清 | 亚洲已满18点击进入久久| 999久久久久久| 色综合天天狠天天透天天伊人| 欧美精品三级在线| 免费人成在线观看视频播放| 成人精品在线视频观看| 国产一级淫片免费| 日韩成人在线观看| 老司机2019福利精品视频导航 | 欧美激情在线| 美女搡bbb又爽又猛又黄www| 五月综合激情网| 免费在线性爱视频| 国产精品极品美女在线观看免费| 欧美伦理在线视频| www.色就是色.com| 亚洲另类色综合网站| 成人小说亚洲一区二区三区 | 国产黄色免费观看| 一区二区亚洲精品国产| 天堂久久一区| 日韩免费在线观看av| 久久伊人中文字幕| 中文字幕一区二区三区波野结 | 日韩av在线网站| 欧洲一区二区三区精品| 亚洲图片小说在线| 粉嫩av一区二区三区粉嫩| 一级片视频在线观看| 久久精品国产亚洲精品2020| 国产精品qvod| 亚洲天堂av线| 亚洲精品成人在线| 偷拍自拍在线| 91丨九色丨国产在线| 在线观看视频免费一区二区三区| 中文精品在线观看| 69精品人人人人| 男人的天堂免费在线视频| 中国一区二区三区| 菠萝蜜视频在线观看一区| 在线视频 91| 久久久免费电影| 日韩欧美视频| 国产成人精品无码片区在线| 欧美日韩久久一区二区| 91av久久| 手机在线视频你懂的| 久久综合99re88久久爱| av中文字幕第一页| 国产成人在线一区|