章節 23 探索 Git 內部: 直接操作 Git 物件
學習目標
- 探索物件儲存的結構。
- 了解如何使用 SHA1 hashes 編碼查詢檔案庫中的資料內容。
現在讓我們使用 git 提供的一些指令來直接查詢 git 物件( .git 中的內容)
查出最新一次的送交01
執行:
git hist --max-count=1
這個指令將會顯示出檔案庫最新的一次送交。您實作中看到的 sha1 hash值可能和範例中的完全不同,不過您也應該看到類似的東西。
輸出:
$ git hist --max-count=1 * 76ba0a7 2012-03-06 | Added a Rakefile. (HEAD, master) [Jim Weirich]
輸出(檢視/傾印/dump)最新的一次送交02
使用上面查到的 SHA1 hash 來觀察物件紀錄的資料 …
執行:
git cat-file -t <hash> git cat-file -p <hash>
下面是我輸出的資料 …
輸出:
$ git cat-file -t 76ba0a7 commit $ git cat-file -p 76ba0a7 tree 096b74c56bfc6b40e754fc0725b8c70b2038b91e parent b8f15c35ac4e42485773fec06e7155203a16c986 author Jim Weirich <jim (at) edgecase.com> 1331068328 -0500 committer Jim Weirich <jim (at) edgecase.com> 1331068328 -0500 Added a Rakefile.
注意: 如果您在前面別名的章節有定義了 ‘type’ 和 ‘dump’ 的別名, 那現在您就可以直接使用git type
和 git dump
,您可以使用它來代替 cat-file,比起使用 cat-file 這比較簡短。(我總是記不住太長的指令XD)
這個物件是 master 分支最近的一次送交(commit),這裡您可以稍微瞭解一下 git 基本上使用 blob, tag, commit, tree 這四種物件型別來分別記錄資料。您可以看出 參數 -t (type) 查到的是該 sha1 hash 的型別,而 -p 參數則記錄了該物件儲存的資料。
查詢樹狀結構 03
我們輸出了這次送交的資料,從記錄中我們看到其實 git 是用 tree 這個物件型別來儲存目錄的檔案結構(樹狀結構),就是這次專案包含了哪些檔案並且個別應該是在哪個子目錄底下。值得注意的是 git 的 tree 型別只有記錄一層的結構(您可以就把它理解成目錄)然後如果需要子目錄那麼這個 tree 裡面就會再有一個 tree 物件。接著我們就用這個 tree 的 SHA1 hash 來觀察所謂的 tree 物件實際上記錄了些什麼。
為了使您可以快速地掌握物件型別的意思,您可以將它想成是一種資料格式。舉例來說 commit 這個資料格式裡面就必須要包含 tree, parent, author , committer 這幾種資料。另外提到的是 commit 的 tree 他指向的就是這個專案最上面一層的目錄。
執行:
git cat-file -p <treehash>
我們的樹狀結構看起來就像這樣…
輸出:
$ git cat-file -p 096b74c 100644 blob 28e0e9d6ea7e25f35ec64a43f569b550e8386f90 Rakefile 040000 tree e46f374f5b36c6f02fb3e9e922b79044f754d795 lib
沒錯,您會看到 Rakefile 和 lib 目錄。這樣是否能比較理解上面所表達的意思。
輸出 lib 目錄 04
執行:
git cat-file -p <libhash>
輸出:
$ git cat-file -p e46f374 100644 blob c45f26b6fdc7db6ba779fc4c385d9d24fc12cf72 hello.rb
這邊就是顯示出 lib 目錄裡( tree )包含了 hello.rb
,另外您可能觀察到 blob 這個東西,是的!他就是 git 用來儲存一般內容檔案的格式,不管是圖片或者word文件都是用這個格式來儲存。
輸出 hello.rb
檔案 05
執行:
git cat-file -p <rbhash>
輸出:
$ git cat-file -p c45f26b # Default is World # Author: Jim Weirich (jim@somewhere.com) name = ARGV.first || "World" puts "Hello, #{name}!"
到這裡您已經完成了探索並瞭解 git 的一些內部運作的原理,物件型別,然後針對 tree, commit 和 blob 物件去查詢紀錄的資料。
接著您可以到處玩玩看 06
接著您應該試著自己去操作看看,看看您是否能夠掌握上面的原則,自己從 commit 一路手動查詢 SHA1 hash 觀察記錄的資料,然後找到您想確認的那份檔案的內容。