iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
1
DevOps

Git 其然,Git 其所以然系列 第 19

Git Submodule

  • 分享至 

  • xImage
  •  
# 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 值。

A、待敘項目

  • 描述 submodule 中的 submodule

上一篇
Git Merge
下一篇
How Git Works: README
系列文
Git 其然,Git 其所以然31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言