# Outline
一、論述
A、待敘項目
# TL;DR
...
# Updated
2019-10-06: 更新文章結構
在雙十連假前,此系列文每天的發文時都會以最簡陳述為主,以求在繁忙的日常中,至少能先維持挑戰鐵人賽的進度,並且逐漸拓展思路與系列結構。預期會在國慶連假將本篇文章論述完整。
今天先簡單研究一下 Git Submodule 的機制。
先在專案根目錄透過 git submodule add
在專案新增一個根目錄。
$ cd ~/how-git-work-lab
$ git submodule add git@github.com:fntsrlike/fntsr.tw-2019.git sumodule
Cloning into '/Users/ironman/how-git-works-lab/sumodule'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 415 (delta 9), reused 4 (delta 0), pack-reused 396
Receiving objects: 100% (415/415), 5.90 MiB | 1.41 MiB/s, done.
Resolving deltas: 100% (209/209), done.
這時候下 git status
會發現,目錄底下多了兩個檔案,一個是 .gitmodule
一個是 submodule
:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: .gitmodules
new file: submodule
.gitmodule
底下紀錄了一個這個 submodule 的資訊,包括在專案目錄底下的路徑以及 Repository URL:
$ cat .gitmodule
[submodule "sumodule"]
path = sumodule
url = git@github.com:fntsrlike/how-git-works-submodule.git
而 submodule
就是該 Repository 底下的內容。
有趣的是,該 submodule
底下的 .git
不是目錄形式,而是一個檔案,裡面記錄著:
$ cat .git
../.git/modules/submodule
也就是說這個目錄的所有 Git 資料都是儲存在主專案底下的 .git
目錄中。
另外紀錄當下目錄結構的 Tree Object 是這樣設計的:
$ git cat-file -p b764c
100644 blob bc384c12847d87e54b76ede02ee5fd801e2c251d .gitmodules
100644 blob 8b0aa0b5577953e2a6b9a6a138008229e638f56c README.md
160000 commit 8933ac1d2ff18cff724b3a98dd4e8a0fa57b198c submodule
也就是這個節點被記錄成一個特殊型態,並以 commit
作為識別型別,而他的 SHA 值,就是該 sumodule 目前的 commit 的 SHA 值。