使用git子模块管理项目
简介
开发过程中,往往需要将将项目拆分成不同的模块,Git子模块(git submodule)可以协助我们高效地进行项目管理。另外,子模块的思想也能够强化模块间的独立性,显著降低模块间的耦合度。
参考链接
《Pro Git》的
子模块
章节,https://www.ycmbcd.com/doc/progit/
子模块的基本使用
创建主模块
- 在
github
上创建主模块工程,克隆到本地
jun@jun:~/work/github$ git clone [email protected]:embedded-jun/main-module.git
创建子模块
- 在
github
上创建子模块工程
加入子模块
-
git submodule add
参数git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
-
将子模块加入到主模块,加入主模块时如果不指定路径,默认就是当前目录
jun@jun:~/work/github$ cd main-module/ jun@jun:~/work/github/main-module$ git submodule add [email protected]:embedded-jun/sub-module1.git
-
查看子模块
-
git submodule
查看子模块, 可以看到当前追踪的子模块commit id
jun@jun:~/work/github/main-module$ git submodule 5b30473ad657858aa43662b7acdd69538eb3b0f5 sub-module1 (heads/main)
-
查看
.gitmodules
文件,该文件中说明了子模块的相对路径
以及url
jun@jun:~/work/github/main-module$ cat .gitmodules [submodule "sub-module1"] path = sub-module1 url = [email protected]:embedded-jun/sub-module1.git
-
查看
.git/modules
文件,该目录保存了子模块的一些相关信息jun@jun:~/work/github/main-module$ ls .git/modules/ sub-module1 jun@jun:~/work/github/main-module$ ls .git/modules/sub-module1/ branches config description HEAD hooks index info logs objects packed-refs refs
-
使用
git status
查看jun@jun:~/work/github/main-module$ git status On branch main Your branch is up to date with 'origin/main'. Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: .gitmodules new file: sub-module1
-
此时子模块还没有真正加入到主模块中,如果执行
git submodule deinit
删除子模块时会报错,必须commit一次,才算真正加入了子模块jun@jun:~/work/github/main-module$ git commit -m "feat: add submodule sub-module1" [main 0089fb8] feat: add submodule sub-module1 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 sub-module1
删除子模块
git submodule deinit
参数git submodule [--quiet] deinit [-f|--force] (--all| [--] <path>...)
- 删除
jun@jun:~/work/github/main-module$ git submodule deinit ./sub-module1/ Cleared directory 'sub-module1' Submodule 'sub-module1' ([email protected]:embedded-jun/sub-module1.git) unregistered for path 'sub-module1' jun@jun:~/work/github/main-module$ git rm ./sub-module1/ rm 'sub-module1'
git status
查看jun@jun:~/work/github/main-module$ git status On branch main Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: .gitmodules deleted: sub-module1
- 查看
.gitmodules
文件的变化,可以看到子模块相关信息已经被删除了jun@jun:~/work/github/main-module$ git diff --cached .gitmodules diff --git a/.gitmodules b/.gitmodules index 8961d31..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ [submodule "sub-module1"] path = sub-module1 url = [email protected]:embedded-jun/sub-module1.git
- 做一次提交
jun@jun:~/work/github/main-module$ git commit -m "feat: delete submodule sub-module1" [main 8499fe4] feat: delete submodule sub-module1 2 files changed, 4 deletions(-) delete mode 160000 sub-module1
更新子模块
-
在子模块中创建并提交文件
main.cpp
jun@jun:~/work/github/main-module/sub-module1$ git status On branch main Your branch is up to date with 'origin/main'. Untracked files: (use "git add <file>..." to include in what will be committed) main.cpp nothing added to commit but untracked files present (use "git add" to track) jun@jun:~/work/github/main-module/sub-module1$ git add . jun@jun:~/work/github/main-module/sub-module1$ git commit -m "feat:add main.cpp" [main 8332956] feat:add main.cpp 1 file changed, 6 insertions(+) create mode 100644 main.cpp
-
在父目录即主模块中使用
git status
查看状态,可见主模块并不知道子模块中哪些文件做了修改,只知道子模块有变化jun@jun:~/work/github/main-module$ git status On branch main Your branch is up to date with 'origin/main'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: sub-module1 (new commits) no changes added to commit (use "git add" and/or "git commit -a")
-
在主模块中使用
git diff
查看有哪些变化,可见只有.gitmodules
中子模块的commit id
发生了变化jun@jun:~/work/github/main-module$ git diff diff --git a/sub-module1 b/sub-module1 index 5b30473..8332956 160000 --- a/sub-module1 +++ b/sub-module1 @@ -1 +1 @@ -Subproject commit 5b30473ad657858aa43662b7acdd69538eb3b0f5 +Subproject commit 8332956869efb53b6952c9bdbb687317f78362ac
-
在主模块中更新子模块的
commit id
:
克隆含有子模块的项目
git clone [email protected]:embedded-jun/main-module.git --recursive
致谢
感谢大佬鹏哥近三年来的指导,恭喜鹏哥更进一步!
莫问前程事,飒然沙上蓬
他日见张禄,绨袍怀旧恩