git 子模块
我们需要在git 仓库中引入另一个git仓库,同时保持这两个仓库各自独立提交和拉取,这就是git子模块可以解决的问题。
添加子模块
在一个主项目中,添加子模块(一个git仓库),如下:
git submodule add git地址/https地址 目录名
$ git submodule add git@gitee.com:fredricen/flask-client.git client
添加完要提交
$ git commit -am "add submodule client"
提交完要推送
$ git push origin master
克隆含有子模块的项目
$ git clone --recurse-submodules git@gitee.com:fredricen/flask-client.git
在包含子模块的项目上工作
从子模块的远端拉取上游修改
在主项目目录下,执行
git submodule update --remote 指定模块名(如果不指定,则拉取全部子模块)
$ git submodule update --remote client
也可以直接进入子项目目录,然后执行
git pull
从项目远端拉取上游修改
在主项目目录下,可以直接拉取项目和子模块的修改,执行
git pull --recurse-submodules
$ git pull --recurse-submodules
但是,这里需要注意,如果是在IDE上打开的控制台,比如pycharm的terminal,由于该控制台不是具有管理员权限,所以执行该命令,会报错:
Fetching submodule client
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Errors during submodule fetch:
client
解决方法就是,使用git bash,并且git bash是管理员权限用户打开
如果设置了ssh密码,会弹窗要求输入:
输入之后,即可正常拉取
在子模块上跟踪修改
首先,进入子模块目录,并检出对应分支
$ cd client
$ git checkout master
并在其上,进行相应修改。
然后,进入主项目目录,执行
$ cd ..
$ git submodule update --remote --merge
进行手动更新子模块,如果有冲突的话,需要进去子模块目录进行处理,不过这里需要注意一下,如果你使用的是pycharm的git工具来进行,最好通过git工具来操作,否则命令行输入的命令可能没有正确提交。
发布子模块改动
git在推送到主项目前检查所有子模块是否已推送,执行
$ git push --recurse-submodules=check
git在推送到主项目前检查所有子模块是否已推送,并按需推送,执行
$ git push --recurse-submodules=on-demand
更多内容,建议参考这里