Git笔记7(submodule与subtree)

git init --bare 创建裸库(没有工作区,仅仅存放和中转开发者提交代码)

将一个git仓库引入到另一个git仓库

git submodule add git@xxx mymodule 将远程项目拉取到本地mymodule文件夹中 mymodule事先需要不存在,存在即报错
git add .
git commit -m 'addsubmodule'
git push

在mymodule内git pull 则拉取对应改变
git submodule foreach git pull 拉取所有submodule(可以多个submodule,也可以一个submodule内多个文件)更新
子模块有提交,父模块也需要提交

如果一个工程使用了submodule,那么直接clone父项目的的时候,子项目内会是空的
需要git submodule init 初始化,git submodule update --recursive更新

这里如果clone的时候加上recursive参数,子项目在clone的时候就会被正常clone下来
运行git clone git@xxx parentDir --recursive

删除submodule子项目mymodule↓
git rm --cached mymodule 从暂存区移除mymodule
rm -rf mymodule 从工作区删除mymodule
rm .gitmodules 
git add .
git commit -m 'remove submodule'
git push 推送到远程
删除submodule子项目mymodule↑

父工程需要修改子模块的内容,需要git subtree(双向修改)
git subtree可代替git submodule
子项目修改,父项目模块更新:
1.添加subtree远程库 git remote add subtree-origin git@xxx
2.git subtree add --prefix=subtree  subtree-origin master --squash将远程subtree-origin库的master分支克隆到subtree目录下(--prefix=subtree可替换为--prefix subtree还可替换为-P subtree,可选参数squash用于将远程多次提交合并为本地的一次提交合并还有一个本地的merge,这样会丢失提交历史)
3.git push推送到远程
4.更新子模块内容git subtree pull -prefix=subtree subtree-origin master --squash
5.git push 将子模块推送到父工程远程仓库

在父项目中子模块中修改
父项目git add .     git commit -m 'xxx'   git push会将子模块修改推送到父项目远程仓库的子模块
git subtree push -prefix=subtree subtree-origin master -d将子模块修改推送到子项目远程仓库(参数d打开调试信息)
pull的时候间断(有时候加有时候不加)加了--squash参数,会导致git subtree push -prefix=subtree subtree-origin master异常
一开始就加上--squash后,要一直加--squash参数
加上--squash后,有时候找不到共有节点,需要merge

git subtree split 将特定模块的代码分割出来,提交历史仅仅包含对模块里相关文件有修改的提交



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页