Git托管項目的.git目錄下都有什么?

我們在使用git托管項目代碼時,如果是新建項目需要通過git init命令在項目根目錄下初始化.git目錄來實現(xiàn)后續(xù)的代碼托管管理,如果直接從代碼倉庫拉取代碼則會自動創(chuàng)建.git目錄與遠程倉庫進行綁定。

.git目錄結(jié)構(gòu)

首先我們先來看看.git這個目錄的結(jié)構(gòu)是什么樣子的,如下所示:

?> ~/s/g/.git on master ? pwd                                                                                                                                                                                                                                                                          10:24:08
/Users/yuqiyu/study/git-chapter/.git
?> ~/s/g/.git on master ? ll                                                                                                                                                                                                                                                                           10:24:09
total 64
-rw-r--r--    1 yuqiyu  staff    16B May 26 13:51 COMMIT_EDITMSG
-rw-r--r--    1 yuqiyu  staff    91B May 27 11:20 FETCH_HEAD
-rw-r--r--    1 yuqiyu  staff    23B May 26 13:33 HEAD
-rw-r--r--    1 yuqiyu  staff    41B May 26 13:50 ORIG_HEAD
drwxr-xr-x    2 yuqiyu  staff    64B May 19 09:07 branches/
-rw-r--r--    1 yuqiyu  staff   361B May 29 09:31 config
-rw-r--r--    1 yuqiyu  staff    73B May 19 09:07 description
drwxr-xr-x   13 yuqiyu  staff   416B May 19 09:07 hooks/
-rw-r--r--    1 yuqiyu  staff   751B May 26 13:51 index
drwxr-xr-x    3 yuqiyu  staff    96B May 19 09:07 info/
drwxr-xr-x    4 yuqiyu  staff   128B May 19 09:08 logs/
drwxr-xr-x  127 yuqiyu  staff   4.0K May 27 11:20 objects/
drwxr-xr-x    6 yuqiyu  staff   192B May 25 16:17 refs/
-rw-r--r--@   1 yuqiyu  staff   174B May 27 11:20 sourcetreeconfig
?> ~/s/g/.git on master ?  

HEAD文件

HEAD是當(dāng)前活動分支的游標(biāo)指向,我們可以查看下該文件的內(nèi)容:

?> ~/s/g/.git on master ? cat HEAD                                                                                                                                                                                                                                                                     11:17:22
ref: refs/heads/master

可以看到HEAD文件目前指向master分支,而master分支則位于refs/heads目錄下,我們接下來可以去refs目錄下看看都有哪些內(nèi)容。

refs目錄

refs目錄存儲了一些引用指向,我們在使用branch、tag時大多數(shù)都是引用到該目錄下,然后再指向具體的objects。

refs目錄結(jié)構(gòu)如下所示:

?> ~/s/g/.g/refs on master ? pwd                                                                                                                                                                                                                                                                       11:26:27
/Users/yuqiyu/study/git-chapter/.git/refs
?> ~/s/g/.g/refs on master ? ll                                                                                                                                                                                                                                                                        11:26:28
total 8
drwxr-xr-x  3 yuqiyu  staff    96B May 26 13:51 heads/
drwxr-xr-x  3 yuqiyu  staff    96B May 25 16:17 remotes/
-rw-r--r--  1 yuqiyu  staff    41B May 19 10:12 stash
drwxr-xr-x  3 yuqiyu  staff    96B May 29 09:36 tags/

refs內(nèi)全部目錄的文件都是存儲的objects引用,我們下面以heads目錄為例

heads

該目錄下存放該項目在本地全部的分支,每個分支文件存儲了commit id,如下所示:

?> ~/s/g/.g/refs on master ? cd heads/                                                                                                                                                                                                                                                                 09:01:37
?> ~/s/g/.g/r/heads on master ? ls                                                                                                                                                                                                                                                                     09:03:13
master
?> ~/s/g/.g/r/heads on master ? cat master                                                                                                                                                                                                                                                             09:03:13
33248b733e36a495ea3691f2d1291c5e77633229

通過cat master命令我們可以查看該文件的內(nèi)容,發(fā)現(xiàn)該文件的內(nèi)容是一長串的字符編號,如果想要知道這個一長串字符編號是什么我們可以通過git cat-file命令來查看類型以及詳細(xì)內(nèi)容,如下所示:

# -t 參數(shù)查看文件的類型
?> ~/s/g/.g/r/heads on master ? git cat-file -t 33248b733e36a495ea3691f2d1291c5e77633229                                                                                                                                                                                                               09:32:11
commit
# -p 參數(shù)查看該文件的詳細(xì)內(nèi)容
?> ~/s/g/.g/r/heads on master ? git cat-file -p 33248b733e36a495ea3691f2d1291c5e77633229                                                                                                                                                                                                               09:59:48
tree 026567e8fe35ef942c1ea7f833799f26027d964f
parent d78e592e663b2a34da826810303bd75f671a84af
author 恒宇少年 <39233436+hengboy@users.noreply.github.com> 1653544281 +0800
committer 恒宇少年 <39233436+hengboy@users.noreply.github.com> 1653544281 +0800

添加默認(rèn)值

通過git cat-file -t命令我們發(fā)現(xiàn)33248b733e36a495ea3691f2d1291c5e77633229文件是一個commit類型的objects,通過git cat-file -p命令就可以查看該文件的詳細(xì)內(nèi)容了。

我們從文件內(nèi)容來看可以猜測出該文件應(yīng)該是對應(yīng)的master分支的最后一次提交的commit,我們可以通過git branch -av命令來查看每個分支的情況,如下所示:

?> ~/s/g/.g/r/heads on master ? git branch -av                                                                                                                                                                                                                                                         09:07:59
* master                33248b7 添加默認(rèn)值
  remotes/origin/master 33248b7 添加默認(rèn)值

發(fā)現(xiàn)本地master分支指向了33248b7,也就是我們剛才cat master內(nèi)容33248b733e36a495ea3691f2d1291c5e77633229的縮寫,這樣我們就明白了,master文件內(nèi)存儲了最新提交的指向。

tags

該目錄下存儲了全部的tag文件,每個tag文件也是存儲了objects指向,一般tag是基于commit來打的所以指向跟commit一致。

我們項目中有個temptag,我們可以查看下該文件的類型以及內(nèi)容:

?> ~/s/g/.g/refs on master ? cd tags/                                                                                                                                                                                                                                                                  10:13:42
?> ~/s/g/.g/r/tags on master ? ls                                                                                                                                                                                                                                                                      10:13:43
temp
?> ~/s/g/.g/r/tags on master ? cat temp                                                                                                                                                                                                                                                                10:13:44
33248b733e36a495ea3691f2d1291c5e77633229
?> ~/s/g/.g/r/tags on master ? git cat-file -t 33248b733e36a495ea3691f2d1291c5e77633229                                                                                                                                                                                                                10:13:46
commit

我們發(fā)現(xiàn)temp分支文件內(nèi)存儲的指向也是33248b733e36a495ea3691f2d1291c5e77633229,temp標(biāo)簽是基于master分支最新commit打的,所以tagobjects指向與master分支的指向是一致的。

config文件

.git目錄下有個config文件,存放了該倉庫的配置信息,內(nèi)容如下:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = git@gitee.com:hengboy/git-chapter.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

該文件內(nèi)定義了一些核心參數(shù)配置、遠程分支信息、本地分支列表等,我們通過git config --local 也可以為該倉庫配置參數(shù),如下所示:

git config --local user.name '恒宇少年'
git config --local user.email 'jnyuqy@gmail.com'

通過上面命令配置后再.git/config文件內(nèi)就會添加對應(yīng)的配置內(nèi)容:

[user]
        name = 恒宇少年
        email = jnyuqy@gmail.com

總結(jié)

git遠比我們想的強大,本文章是一個入門篇,應(yīng)對工作中遇到的各種問題后續(xù)針對git還回詳談,熟練的運用git讓我們在協(xié)同開發(fā)過程中不再有沖突恐懼癥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容