Featured image of post git子模块操作

git子模块操作

git子模块的新增、删除

添加子模块

1
git submodule add <url> <path>

url为子模块git路径 path为子模块存储的目录路径

如,将 hugo-theme-stack 项目作为子模块添加到本地项目的 themes 目录

1
git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git themes

子模块添加成功后,执行 git status 命令可以看到 .gitmodules 文件已被修改,并新增了一个子模块

执行 git diff --cached 命令可以查看修改内容

执行 git commit 命令可以将子模块添加到本地仓库

添加子模块时使用 -b 参数指定分支

1
git submodule add -b main [URL to Git repo];

若子模块已添加,可以在 .gitmodules 中设置分支,其中 public 是主模块中安装子模块的名称, stable 是对应要设置的分支名称。

1
git config -f .gitmodules submodule.public.branch stable

执行后,会在 .gitmodules 中的子模块添加分支(branch = main),如下

1
2
3
4
[submodule "public"]
	path = public
	url = https://github.com/msdemt/msdemt.github.io.git
	branch = main

使用子模块

直接克隆包含子模块的项目时,子模块目录下没有任何文件,需要在项目的根目录下执行如下命令,完成子模块的下载

1
2
git submodule init
git submodule update

或者

1
git submodule update --init

克隆项目的同时下载子模块

1
git clone <url> --recursive

更新子模块

子模块的维护者更新子模块后,使用子模块的项目必须手动更新子模块才可以使用最新的子模块。

在项目中,进入子模块目录下,执行 git pull 更新,执行 git log 可以查看子模块的更新内容。

之后进入项目根目录,使用 git addgit commit 命令将子模块更新到项目中,然后使用 git push 命令将更新子模块的项目推送到远程仓库。

如果自己要修改子模块内容,需要先在子模块根路径下执行 git checkout <分支名> ,然后才可以对该子模块进行修改和提交,否则git push提交时出现Everything up-to-date

将子模块修改提交后,如果希望将项目依赖的子模块更新到最新版本,需要在项目根路径下执行 git submodule update --remote,然后将项目提交到远程仓库。

删除子模块

使用 git submodule deinit <子模块名称>git rm <子模块名称> 命令卸载一个子模块。

如果添加 –force 参数,则子模块工作区内即使有本地的修改,也会被移除。

例如,删除名为 test-submodule 子模块

1
2
git submodule deinit test-submodule
git rm test-submodule

如果完全删除子模块,还需要删除项目根路径下的 .gitmodules 文件和 .git/modules 目录下的子模块文件

问题

  1. 子模块更新分支

添加子模块

1
git submodule add https://github.com/msdemt/msdemt.github.io.git public

子模块更新后,在父模块中更新子模块到最新版本

1
git submodule update --remote

更新失败,错误如下

1
2
fatal: Needed a single revision
无法在子模组路径 'public' 中找到当前版本 origin/maste

发现父模块依赖的子模块分支为master,正确应该是main分支(子模块项目初始分支是master,后来我新增了main作为默认分支,删掉了master分支)

参考:https://blog.csdn.net/weboof/article/details/108517187

更新子模块的分支

1
git config -f .gitmodules submodule.public.branch main

再执行更新子模块

1
git submodule update --remote

参考:
https://blog.csdn.net/guotianqing/article/details/82391665 https://blog.csdn.net/Lee_queenie/article/details/127386151

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计