用 Git submodule 管理子模块

本文详细介绍如何使用Git子模块进行项目管理,包括子模块的添加、修改、删除及远程同步等操作,以及如何处理子模块URL和分支更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     子模块允许你将一个 Git 仓库当作另外一个Git仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。

1. 添加Submodule

  • 添加sass子项目到自己的项目中,使用git命令
git submodule add git@xxx.git sass

现在你项目里就存在sass文件夹,进入子目录,你可以进行sass子项目的操作,进行commit,pull,push等操作都与父项目无关。

  • 在父目录下使用命令
git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      new file:   .gitmodules
#      new file:   sass
  • .gitmodules文件

这是一个配置文件,保存了子目录的git地址信息和branch。

[submodule "sass"]
	path = sass
	url = git@xxx.git
	branch = 3.3.0
  • sass commit的时候有个commit id,父项目的git并不会记录Submodule的文件变动,它是按照commit id指定Submodulegit header
  • 提交submodule
git add .gitmodules sass
git commit -m "sass submodule"
git push origin HEAD

2. 修改submodule

  • 进入sass子目录
cd sass
  • 更新你的子项目,然后使用git命令将改动提交到你的远程服务器
    git status
    git add .
    git commit -m "update submodule"
    git push

     

  •  回到父目录
cd ..

git status 查看状态

modified: sass (new commits)
  • 将submodule的变动push到远程服务器

3. 删除子模块

假如说按照下面这个命令加入子模块

git submodule add -b mybranchname --force https://yourcustomsite.com/test/mysubmodule othername

如果想要删除子模块,则使用命令

git submodule deinit othername

就能够去除本地的子模块文件,如果要删除远程的文件,还需要执行命令

git rm -r othername

,这样也把当前项目的远程仓库里的子模块给删除了

url或者branch有改动

假如说按照下面这个命令加入子模块

git submodule add -b mybranchname --force https://yourcustomsite.com/test/mysubmodule othername

那么子模块加载完成后新增的.gitmodules文件的格式是这样的:

.gitmodules文件的内容

[submodule "othername"]
	path = othername
	url = https://yourcustomsite.com/test/mysubmodule
	branch = mybranchname

 

如果项目里面已经添加了子目录,但是发现url或者branch不对,想要该成果来,那么步骤有以下几个:

  • 步骤一、git submodule deinit othername去除子模块
  • 步骤二、删除.gitmodules文件
  • 步骤三、git rm --cached othername删除本项目仓库里的子模块
  • 步骤四、git submodule add ……添加子模块

有时候操作会有一些提示,比如说

Please stage your changes to .gitmodules or stash them to proceed

一般是因为你没删除.gitmodules文件,就去删远程仓库的子模块了。这个问题的解决办法是:先步骤二、再步骤三

还会有一些提示比如

'othername' already exists in the index

是因为你没有执行步骤三就去执行步骤四了,所以应该先执行步骤三,然后再执行步骤四。

有时候即使按照顺序执行了步骤三、步骤四,但还是会出现xxx already exists in the index的报错,这个时候就要检查一下.git/modules里面是不是已经存在xxx了。

建议

rm -rf .git/modules/*

4. Clone 一个带子模块的项目

当你clone一个带子模块的项目的时候,你将得到包含有子项目的目录,但是子目录为空,没有文件,即sass文件夹存在,但是是空的。你需要运行两个命令:

git submodule init
git submodule update
或:
git submodule update --init --recursive --remote

git submodule init 来初始化你的本地配置文件,git submodule update 来pull子项目到本地,运行完这两个命令的时候,在sass文件夹下就有了内容。

Git submoduleGit 的一个功能,可以将一个 Git 仓库作为另一个 Git 仓库的子目录进行管理。通过使用子模块,我们可以在一个 Git 仓库中使用另一个 Git 仓库的组件。 使用 git submodule 的步骤如下: 1. 在父项目中添加子模块:使用命令 `git submodule add <子模块仓库地址> <子模块存放路径>` 将子模块添加到父项目中。 2. 克隆子模块:使用命令 `git submodule init` 初始化子模块,然后使用命令 `git submodule update` 克隆子模块的内容。 3. 切换到子模块分支:通过 `cd <子模块路径>` 进入子模块目录,然后使用 `git checkout <分支名>` 切换到子模块所在的特定分支。 4. 更新子模块:在父项目中使用命令 `git submodule update --remote` 可以更新子模块为最新的提交。 5. 提交子模块修改:在父项目中修改了子模块后,需要切换到子模块目录,进行提交和推送操作。 使用子模块的好处是可以将子项目作为独立的仓库进行开发和维护,同时在父项目中方便地使用和更新子模块。使用子模块可以实现项目的模块化和复用,提高代码的可维护性和可重用性。 需要注意的是,使用子模块时需要注意子模块的分支和版本控制,因为子模块可能会更新,需要及时更新父项目中的子模块。同时,在多人协作开发中,也需要注意在提交父项目时确保子模块的修改也已经提交。 总之,使用 Git submodule 可以方便地在父项目中使用子模块的组件,提高代码管理的灵活性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值