章節 22 探索 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 AndyYou  1339766324 +0800
committer AndyYou  1339766324 +0800

Added a comment

HEAD 檔案 06

執行:

cat .git/HEAD

輸出:

$ cat .git/HEAD
ref: refs/heads/master

HEAD 檔案記錄了指向目前的分支。現在您應該會看到指向 master 。

目錄