子模块允许你将一个 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
指定Submodule
的git 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文件夹下就有了内容。