借助AI學習開源代碼git0.7之編譯和使用

如何學習優秀的開源代碼?目前大部分的優秀開源代碼,代碼量都已經非常龐大,比如git。以git為例,git最新版本代碼有279814行,
而git0.7版本已經大部分實現了現在git版本的基本功能,而代碼量卻只有4950行,
借助ai工具幫忙分析和整理,加上自己的代碼閱讀和學習驗證,就可以從這些開源大神的代碼中學到很多,從而提高自己。
學習源碼之前,先編譯和研究下現有編譯的程序的使用。

編譯

本人使用的筆記本是macbook,所以下面的是在macsos下編譯,window和linux需自行驗證。
執行make命令,報錯如下:
“編譯失敗了,錯誤信息是 openssl/sha.h: No such file or directory。”

Makefile 默認使用 OpenSSL 的 SHA1 實現,但我的macos環境中沒有安裝OpenSSL的開發庫,
不過項目本身在mozilla-sha1/和ppc/目錄下提供了SHA1的實現。
可以修改Makefile來使用這些內置的實現。

修改Makefile

修改如下:

diff --git a/cpp/git-0.7/Makefile b/cpp/git-0.7/Makefile
index a4987f3..aa52a05 100755
--- a/cpp/git-0.7/Makefile
+++ b/cpp/git-0.7/Makefile
@@ -39,7 +39,7 @@ LIB_H += diff.hLIB_OBJS += diff.oLIBS = $(LIB_FILE)
-LIBS += -lz -lcrypto
+LIBS += -lzifdef MOZILLA_SHA1SHA1_HEADER="mozilla-sha1/sha1.h"
@@ -50,7 +50,7 @@ ifdef PPC_SHA1LIB_OBJS += ppc/sha1.o ppc/sha1ppc.oelseSHA1_HEADER=<openssl/sha.h>
- ?LIBS += -lssl
+ ?LIBS += -lssl -lcryptoendifendif

重新編譯

make MOZILLA_SHA1=1
ok,編譯成功了。
會在當前目錄生成很多git-*的可執行程序。
0.7版本的git,命令都是以git-開頭的,比如git-init-db,git-update-cache,git-write-tree,git-commit-tree等。不像現在的git,命令都是git開頭的,比如git init,git add,git commit等。

學習使用

先使用,才能更好地去學習源碼。把當前目錄加入PATH中方便使用命令(后續命令都是按加入PATH中)。
根據 README 中的 “Workflow” 部分,一個基本的使用流程如下:

第一步:初始化一個新的 “git” 倉庫

創建一個 .git 目錄,里面包含了對象數據庫 (.git/objects) 和其他必要的文件。

mkdir ~/git_test
cd ~/git_test
git-init-db

第二步:將文件添加到暫存區 (index)

創建一個測試的新文件 hello.txt。

  1. touch hello.txt
  2. echo “hello world” > hello.txt
  3. git-update-cache --add hello.txt

其中git-update-cache命令會:

  1. 為 hello.txt 創建一個 blob 對象,并將其存入對象數據庫。
  2. 在 index 文件中記錄 hello.txt 的信息(文件名、權限、SHA1 等)。

第三步:創建一個 tree 對象

tree 對象代表了當前暫存區 (index) 的狀態。
git-write-tree
這個命令會輸出一個40個字符的SHA1哈希,這就是新創建的tree對象的 ID。需要記下這個ID。

第四步:創建一個 commit 對象

這個 commit 對象會將上一步創建的 tree 對象與一個提交信息和父提交(如果有的話)關聯起來。

  1. 假設上一步得到的 tree SHA1 是 <tree_sha1>
  2. -p <parent_sha1> 是可選的,第一次提交沒有父提交
  3. echo “Initial commit” | ./git-commit-tree <tree_sha1>

注意git0.7這個版本,tree_sha1是需要輸入完整的字符的。
這個命令會輸出一個新的 SHA1 哈希,這是 commit 對象的 ID。可以將這個ID保存到一個文件里,比如.git/HEAD,來跟蹤當前的分支。

其他常用命令

  1. git-cat-file
    * 功能:?
    1. 顯示對象類型 (-t 選項):
    * 給定一個對象的 SHA1 哈希,它會告訴你這個對象是 blob (文件內容)、tree (目錄結構) 還是 commit (提交記錄)。
    2. 顯示對象內容 (指定類型):
    * 給定一個對象的 SHA1 哈希和其類型(blob、tree 或 commit),它會打印出該對象的原始內容。
    * 用法:?
    git-cat-file -t 查看對象類型。
    git-cat-file 查看對象內容

  2. git-ls-tree
    * 功能:
    1. 列出 tree 對象的內容: 它會解析一個 tree 對象的二進制數據,并以人類可讀的格式顯示其包含的條目。
    2. 顯示文件和子目錄: 對于 tree 對象中的每個條目,它會顯示其模式(權限)、類型(blob 或 tree)、SHA1 哈希以及對應的文件名或目錄名。
    3. 遞歸顯示 (可能): 現代 Git 的 ls-tree 命令通常支持遞歸顯示子目錄內容,這個早期版本可能也有類似的功能.

* 用法: git-ls-tree <tree_sha1> 這會列出 tree 對象中的文件和目錄。

  1. git-read-tree
    * 功能:?
    1. 更新暫存區: 它的主要作用是用一個指定的 tree 對象所代表的目錄結構和文件內容來完全替換或更新當前的暫存區(.git/index 文件)。
    2. 準備工作目錄: 當你需要將倉庫歷史中的某個特定狀態(由一個 tree 對象表示)恢復到暫存區時,git-read-tree
    是第一步。例如,在切換分支、合并或檢出舊版本時,你首先會使用 git-read-tree 來更新暫存區,然后可能再使用 git-checkout-cache 將暫存區的內容寫入工作目錄。

* 用法: git-read-tree <tree_sha1>
<tree_sha1>: 你想要加載到暫存區中的 tree 對象的 40 位 SHA1 哈希值。git-read-tree<tree_sha1>這會用指定的tree對象更新 index。

4. git-checkout-cache
* 功能:?
1. 檢出 index 中的文件: 它會從 index 中檢出文件到工作目錄,類似于 git checkout。
2. 檢出 index 中的所有文件: 它會檢出 index 中的所有文件到工作目錄。
* 用法: git-checkout-cache -a 這會檢出 index 中的所有文件到工作目錄。

  1. git-diff-files
    * 功能: 比較工作目錄中的文件與暫存區(index)中的對應文件之間的差異。
    * 用法: git-diff-files 這會顯示工作目錄中所有已修改但尚未添加到暫存區的文件差異。

  2. git-diff-tree
    * 功能: 比較兩個 tree 對象之間的差異,或者一個 tree 對象與工作目錄/暫存區之間的差異。
    * 用法:
    git-diff-tree <tree_sha1_1> <tree_sha1_2>
    比較兩個 tree 對象
    git-diff-tree <tree_sha1>
    比較一個 tree 對象與當前暫存區/工作目錄 (具體行為可能需要查看源碼或幫助)

  3. git-rev-tree
    * 功能: 遍歷一個 tree 對象及其所有子對象(包括 blob 和嵌套的 tree),并打印它們的 SHA1 哈希和路徑。
    * 用法: git-rev-tree <tree_sha1> 這類似于 git ls-tree -r 的功能。

  4. git-show-files
    * 功能: 顯示暫存區(index)中所有文件的信息,包括模式、SHA1 和文件名。
    * 用法: git-show-files 這類似于 git ls-files --stage。

  5. git-check-files
    * 功能: 檢查工作目錄中的文件是否與暫存區中的文件匹配。它會報告哪些文件在工作目錄中被修改、刪除或新增。
    * 用法: git-check-files

  6. git-merge-base
    * 功能: 查找兩個或多個提交(commit)的最近共同祖先。這是進行三方合并(three-way merge)的基礎。
    * 用法: git-merge-base <commit_sha1_1> <commit_sha1_2> 會輸出共同祖先的 SHA1 哈希。

  7. git-merge-cache
    * 功能: 執行三方合并,將三個 tree 對象(通常是共同祖先、分支 A 和分支 B)合并到暫存區(index)中。
    * 用法: git-merge-cache <base_tree_sha1> <our_tree_sha1> <their_tree_sha1>
    這個命令會將合并結果寫入暫存區。如果存在沖突,暫存區會包含沖突標記,需要手動解決。

  8. git-unpack-file
    * 功能: 從對象數據庫中解壓一個 blob 對象并將其內容寫入標準輸出。
    * 用法: git-unpack-file <blob_sha1> > output_file.txt

  9. git-export
    * 功能: 將一個 tree 對象的內容導出到指定目錄。
    * 用法: git-export <tree_sha1> <output_directory>

  10. git-diff-cache
    * 功能: 比較暫存區(index)與一個 tree 對象之間的差異。
    * 用法: git-diff-cache <tree_sha1>

  11. git-rev-list
    * 功能: 遍歷提交歷史,并以逆序(從最新到最舊)打印提交的 SHA1 哈希。
    * 用法: git-rev-list <commit_sha1> 可以用來查看一個提交的所有祖先。

  12. git-mktag
    * 功能: 創建一個 tag 對象。在 Git 中,標簽可以指向一個提交、一個樹或一個 blob,通常用于標記重要的版本。
    * 用法: echo “My tag message” | ./git-mktag <object_sha1> <object_type> 它會輸出新創建的 tag 對象的 SHA1 哈希。

  13. git-tar-tree
    * 功能: 將一個 tree 對象的內容打包成一個 tar 歸檔文件。
    * 用法: git-tar-tree <tree_sha1> > archive.tar

總結一下,一個完整的從無到有的提交流程是:(fish shell為例)

  1. git-init-db
  2. 創建或修改文件
  3. git-update-cache --add …
  4. set -x TREE_ID $(git-write-tree)
  5. set -x COMMIT_ID $(echo “My commit message” | git-commit-tree $TREE_ID)
  6. echo $COMMIT_ID > .git/HEAD

這就是這個早期 git 0.7版本的基本用法。它比現代的git要底層和手動得多,但核心概念是一致的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91515.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ObservableCollection全面解析

本文僅作為參考大佬們文章的總結。 ObservableCollection是C#中一個功能強大的動態數據集合類&#xff0c;特別適用于需要數據綁定和UI自動更新的場景。本文將系統性地總結ObservableCollection的核心概念、使用方法、性能優化策略以及在實際項目中的應用實踐。 一、Observab…

佰力博檢測與您探討超高溫介電測試的應用領域

超高溫介電測試是指在極端高溫條件下&#xff08;通常高于1000℃&#xff09;對材料的介電性能進行測量和分析的過程。以評估材料在高溫環境下的電學性能穩定性&#xff0c;如介電常數、介電損耗、阻抗譜等參數。超高溫介電測試需要用到的超高溫介電阻抗測試設備&#xff1a;UT…

OneCode自治UI核心組件Layout布局介紹:構建靈活高效的界面布局系統

在現代前端開發中&#xff0c;布局系統扮演著至關重要的角色&#xff0c;它不僅決定了界面的結構美感&#xff0c;更直接影響用戶體驗和開發效率。OneCode作為一款企業級低代碼開發平臺&#xff0c;其布局引擎通過精巧的設計實現了簡潔API與強大功能的完美平衡。本文將深入剖析…

為何“白名單媒體”是性價比之選?

在信息媒體空前發展的今天&#xff0c;軟文營銷已成為企業品牌推廣的重要手段之一。然而&#xff0c;面對眾多媒體&#xff0c;如何選擇高性價比的發稿媒體成為許多營銷人員的一個課題。其中&#xff0c;“白名單媒體”憑借其高收錄率、權威背書等優勢&#xff0c;逐漸成為軟文…

Python 異步編程之 async 和 await

基礎知識 在 Python 中&#xff0c;async 和 await 是用于異步編程的關鍵字&#xff0c;引入了異步/協程&#xff08;coroutine&#xff09;的概念。核心思想是通過 協程&#xff08;Coroutine&#xff09; 和 事件循環&#xff08;Event Loop&#xff09; 實現非阻塞并發&…

關于接口測試的HTTP基礎【接口測試】

HTTP 協議基礎知識總結&#xff08;用于 Web API 接口測試&#xff09;接口測試中最常用的通訊協議就是 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff0c;本節旨在幫助理解 HTTP 協議的結構、工作流程以及如何用于接口測試。一、HTTP 協議簡介HTTP 是一種…

STM32 DMA通信詳解

STM32 DMA通信詳解DMA(Direct Memory Access&#xff0c;直接內存訪問)是STM32微控制器中一種重要的數據傳輸機制&#xff0c;它允許外設與內存之間或內存與內存之間直接傳輸數據&#xff0c;而無需CPU的干預。這種機制可以顯著提高系統性能&#xff0c;特別是在需要高速數據傳…

pytest--1--pytest-mock常用的方法

1. mocker.patch mocker.patch 是最常用的方法&#xff0c;用于替換指定的對象或方法。它可以用于模擬函數、方法、類或模塊。 語法 mocker.patch(target, newDEFAULT, specNone, createFalse, spec_setNone, autospecNone, new_callableNone, **kwargs)示例 import pytest fro…

尚庭公寓----------分頁查詢

根據條件分頁查詢公寓列表 進行分頁配置 package com.nie.lease.common.mybatisplus;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.in…

【圖像質量評價指標】圖像熵(Image Entropy) —— 熵值飽和現象

文章目錄一、圖像熵&#xff08;Image Entropy&#xff09;&#xff08;1&#xff09;基本原理&#xff08;2&#xff09;優勢與局限&#xff08;3&#xff09;推薦策略多指標聯合推薦體系噪聲應對機制建議二、項目實戰 —— 通過圖像熵評價序列圖像&#xff0c;并提取最優圖像…

GaussDB in的用法

1 in的作用in運算符允許您在WHERE子句中指定多個值。 in運算符是多個OR條件的簡寫。2 in的語法select column_name(s) from table_name where column_name in (value1, value2, ...); 或者 select column_name(s) from table_name where column_name in (select statement);3 i…

【C語言進階】內存函數

目錄 1.memcpy函數 1.1 模擬實現 2.memmove函數 3.memcmp函數 1.memcpy函數 字符串拷貝strcpy和strncpy是有一定局限性的&#xff0c;只能拷貝字符串&#xff0c;而memcpy可以拷貝任意類型的數據&#xff0c;單位是字節。 1.1 模擬實現 #include<stdio.h> #include&l…

從亂序到整潔:Swift 實現奇偶鏈表重排的最佳方案

文章目錄摘要描述題解答案題解代碼分析分段講解示例測試及結果時間復雜度空間復雜度總結摘要 在開發中&#xff0c;鏈表結構經常出現在緩存淘汰、操作系統任務調度、或是 LRU 算法中&#xff0c;尤其是對節點位置的靈活操作更是鏈表的強項。LeetCode 第 328 題「奇偶鏈表」就給…

WPF+CEF 執行JS報錯

WPFCEF 執行JS報錯 在WPF中執行 webBrowser.EvaluateScriptAsync(“window.scrollBy(0, 1000);”); 在部分網站會報異常&#xff1a; Request BrowserId : XXXX not found it’s likely the browser is already closed環境 .Net Framework 4.7 CefSharp.Wpf 131.3.50 解決方案&…

【Python3-Django】快速掌握DRF:ModelViewSet實戰指南

DRF講解 1. 什么是 Django 和 Django REST Framework&#xff1f; 在深入 ModelViewSet 之前&#xff0c;我們先簡單了解一下背景知識&#xff1a; Django 是一個基于 Python 的 Web 開發框架&#xff0c;旨在幫助開發者快速構建安全、可擴展的 Web 應用。它遵循“不要重復自己…

TRAE IDE** 下載、安裝、開發、測試和部署 2048 小游戲的全流程指南

以下是一份完整的 TRAE IDE 下載、安裝、開發、測試和部署 2048 小游戲的全流程指南。整個過程基于 TRAE 作為 AI 輔助編程工具的特性&#xff08;對標 Cursor/AWS Kiro&#xff09;&#xff0c;假設它支持智能代碼生成和云部署功能。 【插播】騰訊云AI Coding大賽https://mar…

重學前端005 --- 響應式網頁設計 CSS 盒子模型

文章目錄BOX 盒子概念CSSoverflow: hidden;filter: blur(3px);box-shadow: 0 0 3px 3px #efb762;border-radius: 30px 25px 60px 12px;transform: rotate(-0.6deg);每個 HTML 元素都是一個盒子&#xff0c;它擁有著自己的間距和邊框。這叫作“盒子模型”。 BOX 盒子概念 內容…

TC500R立式加工中心主軸箱機械結構設計cad【11張】三維圖+設計說明書

TC500R立式加工中心主軸箱機械結構設計 摘 要 數控機床作為工業制造的基礎&#xff0c;在國家的發展中起著非常重要的作用。隨著我國經濟的快速發展&#xff0c;我國已經成為工業制造大國&#xff0c;制造業的發展離不開數控機床&#xff0c;而TC500R立式加工中心作為數控機床…

CSS Grid布局:構建現代網頁的強大網格系統

目錄 一、Grid布局基礎概念 1.1 網格容器與網格項 1.2 創建基本網格 二、核心屬性詳解 2.1 定義網格軌道 2.2 網格間距控制 2.3 網格項對齊方式 三、實戰布局技巧 3.1 創建經典布局 3.2 網格項定位技巧 3.3 響應式網格設計 四、Grid布局 vs Flexbox布局 五、高級…

Elasticsearch / MongoDB / Redis / MySQL 區別

1、一句話簡介名稱核心用途Elasticsearch強大的全文檢索與日志分析引擎MongoDB靈活的文檔數據庫&#xff0c;適合半結構化/結構化數據Redis高性能的內存鍵值緩存數據庫&#xff0c;用于實時高并發處理MySQL經典關系型數據庫&#xff0c;強事務支持&#xff0c;結構化數據持久存…