章節 22 探索 Git 內部: .git 目錄
學習目標
- 了解 .git 目錄結構和 git 是如何用 .git 這個目錄記錄資訊。
.git
目錄 01
現在是時候讓我們更深入地瞭解 git 了。首先,先切換到您的專案目錄 …
執行:
ls -C .git
輸出:
$ ls -C .git COMMIT_EDITMSG config index objects HEAD description info refs ORIG_HEAD hooks logs
這是個很神奇的目錄,它儲存了所有 git 需要的資料。接著讓我們瞧瞧這些物件目錄(objects directory)。
物件儲存( git 的物件形態 ) 02
執行:
ls -C .git/objects
輸出:
$ ls -C .git/objects 09 24 30 43 69 78 9c b8 e4 pack 11 27 3c 49 6b 97 af c4 e7 1b 28 40 59 76 9a b5 d2 info
您應該會看到一堆名稱是兩個字母的目錄。這些目錄對應 git 儲存的檔案(或目錄),然後 git 使用 sha1 hash 為這些資料命名,您所看到的目錄名稱其實就是這些 hash 的前兩碼。
深入探索物件儲存e 03
執行:
ls -C .git/objects/<dir>
輸出:
$ ls -C .git/objects/09 6b74c56bfc6b40e754fc0725b8c70b2038b91e 9fb6f9d3a104feb32fcac22354c4d0e8a182c1
讓我們看看其中的一個目錄。您應該會看到一些檔案,檔名是由38個字母(hash)。這些檔案的內容是 git 用來記錄檔案資料的物件。這些都是經過壓縮和加密。 因此沒辦法直接開啓查看裡面的內容。不過 git 有提供一些指令,以方便我們查看裡面真正被保存的內容。
設定檔 04
執行:
cat .git/config
輸出:
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true [user] name = Jim Weirich email = jim (at) edgecase.com
這是隸屬於該專案的設定檔。 當進入這個專案這個設定檔的設定值會蓋過全域的設定檔(該使用者的設定檔),全域的設定檔也會影響這個專案他的路徑在您的家目錄中的 .gitconfig
分支和標簽05
執行:
ls .git/refs ls .git/refs/heads ls .git/refs/tags cat .git/refs/tags/v1
輸出:
$ ls .git/refs heads tags $ ls .git/refs/heads master $ ls .git/refs/tags v1 v1-beta $ cat .git/refs/tags/v1 40543214b69016a1f079a0d95ff88cc7421e9b54
您應該可以認出在 tag 目錄下的檔案。每個檔案都對應您剛剛用 git tag 建立的標簽。裡面的內容就是標簽對應的 hash 。您可以進一步使用 git cat-file -p 去查看內容。就會發現它記錄了一些資訊。這在 git 的物件型別中稱之為 commit 就是記錄每個版本的資訊。
heads目錄也一樣,不過是分支的名稱。我們現在只有一個分支,所以您只能看到目錄裡有一個 master 的檔案。
$ cat .git/refs/tags/v1 539ca38380a0352c829ab5f8393d1dc77950a266 $ git cat-file -p 539ca38380a0352c829ab5f8393d1dc77950a266 tree 8090068ee35ad95bf52accc791313d742ea3b08e parent 6deffafb4c1db2eea8effc2b3e6214c9f79d81d1 author AndyYou1339766324 +0800 committer AndyYou 1339766324 +0800 Added a comment
HEAD 檔案 06
執行:
cat .git/HEAD
輸出:
$ cat .git/HEAD ref: refs/heads/master
HEAD 檔案記錄了指向目前的分支。現在您應該會看到指向 master 。