git submodule 管理子工程

摘要:当多人共同维护一个项目时,必然需要进行模块化开发,所以使用submodule来管理子工程很有必要。本文以图文并貌的形势进行一步步搭建主工程及绑定子工程。

1、在Github上分别建立主工程HDMasterProject和两个子工程(动态/静态库)HDSubProjectOne、HDSubProjectTwo.
SZ-denglibing:~ fangdd$ cd /Harry/Projects/HDMaster-SubProject/HDMasterProject
SZ-denglibing:HDMasterProject fangdd$ git init
Initialized empty Git repository in /Harry/Projects/HDMaster-SubProject/HDMasterProject/.git/
SZ-denglibing:HDMasterProject fangdd$ git add .
SZ-denglibing:HDMasterProject fangdd$ git commit -m ‘初始化工程‘
[master (root-commit) 10f33c6] 初始化工程
 12 files changed, 639 insertions(+)
 create mode 100644 HDMasterProject.xcodeproj/project.pbxproj
 create mode 100644 HDMasterProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata
 create mode 100644 HDMasterProject.xcodeproj/xcuserdata/fangdd.xcuserdatad/xcschemes/HDMasterProject.xcscheme
 create mode 100644 HDMasterProject.xcodeproj/xcuserdata/fangdd.xcuserdatad/xcschemes/xcschememanagement.plist
 create mode 100644 HDMasterProject/AppDelegate.h
 create mode 100644 HDMasterProject/AppDelegate.m
 create mode 100644 HDMasterProject/Base.lproj/LaunchScreen.storyboard
 create mode 100644 HDMasterProject/Base.lproj/Main.storyboard
 create mode 100644 HDMasterProject/Info.plist
 create mode 100644 HDMasterProject/ViewController.h
 create mode 100644 HDMasterProject/ViewController.m
 create mode 100644 HDMasterProject/main.m
SZ-denglibing:HDMasterProject fangdd$ git remote add origin https://github.com/erduoniba/HDMasterProject.git
SZ-denglibing:HDMasterProject fangdd$ git push origin master
Counting objects: 21, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (21/21), 7.45 KiB | 0 bytes/s, done.
Total 21 (delta 2), reused 0 (delta 0)
To https://github.com/erduoniba/HDMasterProject.git
 * [new branch]      master -> master

SZ-denglibing:HDMasterProject fangdd$ cd ./HD
HDMasterProject/           HDMasterProject.xcodeproj/
SZ-denglibing:HDMasterProject fangdd$ cd ../
HDMasterProject/ HDSubProjectOne/ HDSubProjectTwo/
SZ-denglibing:HDMasterProject fangdd$ cd ../HDSubProjectOne/
SZ-denglibing:HDSubProjectOne fangdd$ git init
Initialized empty Git repository in /Harry/Projects/HDMaster-SubProject/HDSubProjectOne/.git/
SZ-denglibing:HDSubProjectOne fangdd$ git add .
SZ-denglibing:HDSubProjectOne fangdd$ git commit -m ‘初始化子工程1‘
[master (root-commit) 9c5c421] 初始化子工程1
 6 files changed, 438 insertions(+)
 create mode 100644 HDSubProjectOne.xcodeproj/project.pbxproj
 create mode 100644 HDSubProjectOne.xcodeproj/project.xcworkspace/contents.xcworkspacedata
 create mode 100644 HDSubProjectOne.xcodeproj/xcuserdata/fangdd.xcuserdatad/xcschemes/HDSubProjectOne.xcscheme
 create mode 100644 HDSubProjectOne.xcodeproj/xcuserdata/fangdd.xcuserdatad/xcschemes/xcschememanagement.plist
 create mode 100644 HDSubProjectOne/HDSubProjectOne.h
 create mode 100644 HDSubProjectOne/Info.plist
SZ-denglibing:HDSubProjectOne fangdd$ git remote add origin https://github.com/erduoniba/HDSubProjectOne.git
SZ-denglibing:HDSubProjectOne fangdd$ git push origin master
Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 4.56 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
To https://github.com/erduoniba/HDSubProjectOne.git
 * [new branch]      master -> master

SZ-denglibing:HDSubProjectOne fangdd$ cd ../HDSubProjectTwo/
SZ-denglibing:HDSubProjectTwo fangdd$ git init
Initialized empty Git repository in /Harry/Projects/HDMaster-SubProject/HDSubProjectTwo/.git/
SZ-denglibing:HDSubProjectTwo fangdd$ git add .
SZ-denglibing:HDSubProjectTwo fangdd$ git commit -m ‘初始化子工程2‘
[master (root-commit) 9be396f] 初始化子工程2
 6 files changed, 438 insertions(+)
 create mode 100644 HDSubProjectTwo.xcodeproj/project.pbxproj
 create mode 100644 HDSubProjectTwo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
 create mode 100644 HDSubProjectTwo.xcodeproj/xcuserdata/fangdd.xcuserdatad/xcschemes/HDSubProjectTwo.xcscheme
 create mode 100644 HDSubProjectTwo.xcodeproj/xcuserdata/fangdd.xcuserdatad/xcschemes/xcschememanagement.plist
 create mode 100644 HDSubProjectTwo/HDSubProjectTwo.h
 create mode 100644 HDSubProjectTwo/Info.plist
SZ-denglibing:HDSubProjectTwo fangdd$ git remote add origin https://github.com/erduoniba/HDSubProjectTwo.git
SZ-denglibing:HDSubProjectTwo fangdd$ git push origin master
Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 4.55 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
To https://github.com/erduoniba/HDSubProjectTwo.git
 * [new branch]      master -> master
SZ-denglibing:HDSubProjectTwo fangdd$
2、分别在两个子工程添加代码进行测试:
@implementation HDSubProjectMethodOne
+ (void)hdSubProjectMethodOne{
    NSLog(@"hdSubProjectMethodOne");
}
@end
?
@implementation HDSubProjectMethodTwo
+ (void)hdSubProjectMethodTwo{
    NSLog(@"hdSubProjectMethodTwo");
}
@end

然后在各自的HDSubProjectOne.hHDSubProjectTwo.h添加对测试代码头文件

3、添加子工程到主工程中(单纯的添加,而不是子模块绑定)

打开主工程,建立2个工程文件夹,分别将 HDSubProjectOne.xcodeproj 和 HDSubProjectTwo.xcodeproj 拖到文件夹中,如下:

在主工程的AppDelegate中调用2个子工程的代码:

嗯哼,找不到文件,看看HDSubProject下面,发现什么都没有,这个是因为直接拖动.xcodeproj只是引用,而没有将代码拷贝:

该问题解决:杜甲同学的专栏 iOS 创建多个子工程的方法

字段说明:

$(SRCROOT)表示工程.xcodeproj所在的相对路径,比如我的电脑可能是harry/project/HDMasterProject/ 也可能是hhh/xcodeProject/HDMasterProject/

"$(SRCROOT)/当前工程名字/需要包含头文件所在文件夹" 将上面的双引号里面的字符串拷贝之后,你会发现这个“$(SRCROOT)”,会自动变成当前工程所以的目录。这样就可以了,发给别人,别人也不用在去修改路径了。

运行还是有问题,这个时候需要对子工程进行配置:

然后将子工程的动态库加入到主工程中:

运行:

搞定!

4、添加子项目到主项目中(子模块绑定)

相关Git Submodule学习资料:咖啡兔 Git Submodule使用完整教程

使用

git submodule add https://github.com/erduoniba/HDSubProjectOne.git  

git submodule add https://github.com/erduoniba/HDSubProjectTwo.git

将子项目绑定到主项目中。

这个时候你会发现在HDMasterProject会多出2个文件夹,这里的代码其实就是对HDSubProjectOneHDSubProjectTwo2个子项目的clone,以后的代码修改就是在这里修改。

打开.gitmodules

可以看到.gitmodules记录了每个submodule的引用信息,知道在当前项目的位置以及仓库的所在。现在提交主及子项目项目的代码,通知你的小伙伴clone代码吧。

5、他人拉取代码:

现在因为只有一台电脑,所以我将主项目clone到另外一个目录(Desktop)下来 模拟他人操作:

发现我们的子项目并没有clone下来,莫急:

在HDMasterProject中clone 2个子项目

git clone https://github.com/erduoniba/HDSubProjectOne.git
git clone https://github.com/erduoniba/HDSubProjectTwo.git

打开clone下来的主项目,会出现这样的问题:

这个是因为在这里:

是因为第3步的 “打开主工程,建立2个工程文件夹,分别将HDSubProjectOne.xcodeproj
和 HDSubProjectTwo.xcodeproj
拖到文件夹中
” 有问题,原因是 在建立工程时,我们是将下图 1 中的子模块的.xcodeproj拖入到主项目的,但是HDMasterProject并没有包含他们,解决方式:重新将2中的.xcodeproj拖入主项目,提交即可,相应的Destop下的主项目更新代码就OK了。

运行:

6、子项目提交代码,他人更新:

甲同学提交子项目代码:

SZ-denglibing:HDMasterProject fangdd$ cd HDSubProjectOne/
SZ-denglibing:HDSubProjectOne fangdd$ git add .
SZ-denglibing:HDSubProjectOne fangdd$ git commit -m ‘添加测试代码‘
[master 6bdc6eb] 添加测试代码
 2 files changed, 6 insertions(+)
SZ-denglibing:HDSubProjectOne fangdd$ git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 542 bytes | 0 bytes/s, done.
Total 5 (delta 3), reused 0 (delta 0)
To https://github.com/erduoniba/HDSubProjectOne.git
   364abed..6bdc6eb  master -> master

i. 乙同学更新甲同学的子项目代码 方式1 (到子项目直接更新)

SZ-denglibing:HDMasterProject fangdd$ cd HDSubProjectOne/
SZ-denglibing:HDSubProjectOne fangdd$ git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 3), reused 5 (delta 3), pack-reused 0
Unpacking objects: 100% (5/5), done.
From https://github.com/erduoniba/HDSubProjectOne
   364abed..6bdc6eb  master     -> origin/master
Updating 364abed..6bdc6eb
Fast-forward
 HDSubProjectOne/HDSubProjectMethodOne.h | 2 ++
 HDSubProjectOne/HDSubProjectMethodOne.m | 4 ++++
 2 files changed, 6 insertions(+)

ii.乙同学更新甲同学的子项目代码方式2 (到主项目使用git submodule update更新)

cd 主项目路径
git submodule update --remote --merge

但是意外的是改方式一直失败,解决办法:咖啡兔 Git Submodule使用完整教程

SZ-denglibing:HDMasterProject fangdd$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/erduoniba/HDMasterProject.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

可以看到git的config中并没有任何关于子项目的信息,解决办法:

SZ-denglibing:HDMasterProject fangdd$ git submodule init
Submodule ‘HDSubProjectOne‘ (https://github.com/erduoniba/HDSubProjectOne.git) registered for path ‘HDSubProjectOne‘
Submodule ‘HDSubProjectTwo‘ (https://github.com/erduoniba/HDSubProjectTwo.git) registered for path ‘HDSubProjectTwo‘
SZ-denglibing:HDMasterProject fangdd$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/erduoniba/HDMasterProject.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[submodule "HDSubProjectOne"]
    url = https://github.com/erduoniba/HDSubProjectOne.git
[submodule "HDSubProjectTwo"]
    url = https://github.com/erduoniba/HDSubProjectTwo.git

现在赶紧试试吧 (大功告成!!)

7、git submodule 管理子项目相关命令:

在主项目更新子项目代码:

1、cd 主项目目录
2、 git submodule update --remote --merge

在主项目提交子项目的代码:

1、cd 子项目目录
2、git checkout master (将子目录checkout到master分支上)
3、
git pull
git add .
git commit
git push
8、代码下载地址:

HDMasterProject地址

HDSubProjectOne地址

HDSubProjectTwo地址

时间: 2024-11-09 14:32:30

git submodule 管理子工程的相关文章

git submodule的使用

开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用,而公共代码库的版本管理是个麻烦的事情.今天无意中发现了Git的git submodule命令,之前的问题迎刃而解了. 添加 为当前工程添加submodule,命令如下: git submodule add 仓库地址 路径 其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径.  注意:路径不能以 / 结尾(会造成修改不生效).不能是现有工程已有的目录(不能順利 Clone) 命令执行完成,会在当

git submodule获取子模块

从github上获取工程,经常会出现依赖其它github上代码的情况,这时如果每一个都手动下载,实在太麻烦了.其实git给我们提供了相互引用的功能,可以在工程中直接引入其它的代码库,这样可以保证每次使用的子模块也都是最新的. git clone https://github.com/Kjuly/iPokeMon.gitgit submodule initgit submodule update

git之git submodule

git之git submodule 场景一 在本地仓库中,添加远程仓库作为子仓库. 添加submodule工程 git submodule add XXX.git 在本地仓库中,添加一个空仓库作为子仓库 git add .gitmodules (sumodule-name) git commit git submodule init 提交submodule修改 如果修改了submodule仓库的内容 git status git add . git commit git push 然后在主仓库中

Git Submodule管理项目子模块

使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone <repository> --recursive 递归的方式克隆整个项目 git submodule add <repository> <path> 添加子模块 git submodule init 初始化子模块 git submodule update 更新子模块 gi

Tutorial for adding a library project as git submodule and then using it as a studio Module

https://gitsubmoduleasandroidtudiomodule.blogspot.in/I'm writing this blog to make the development process easy and faster. This is specific to Android Studio, same can be used for any other project which used Gradle build system and GIT. I want to m

使用git submodule管理一个需要多个分立开发或者第三方repo的项目

在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目一般分为前端和后端两个相对独立的子项目,特别是前端的repo可能在不同的项目中共享,那么这时,你就可能希望将项目分开为前端和后端两个repo,如何管理这种情况呢?一个比较好的方案就是使用git的submodule功能. 假设我们的父repo在prepo目录,sumodule newtestrepo希

git submodule 解析

submodule 原理 submodule 是一个版本库,跟你的主版本库实际上是一个东西. 将 submodule add 到你的主版本库,是将一个子版本库的一条提交,也就是head,被主版本库纪录了下来. 主版本库使用这个版本库head之前的代码. git 是一个文件系统,子版本库的remote地址和这个版本库的head,这些纪录究竟保存在哪里呢. 我们来具体操作一下 我在自己项目中添加了一个临时分支,_my_br, 在这个分支下做下实验 尝试将sqlite作为子版本加入到主版本库中 看一下

Git subtree和Git submodule

git submodule允许其他的仓库指定以一个commit嵌入仓库的子目录. git subtree替代git submodule命令,合并子仓库到项目中的子目录.不用像submodule那样每次子项目修改了后要init和update.万一哪次没update就直接"commit -a" 或者 "add ." 全commit上去就悲剧了. git subtree虽然比git submodule更好用,但也不是特别完美的解决方案,使用时一定要特别注意. git-su

git submodule的操作

对于有submodule的库,检出的方法是: git clone https://github.com/BelledonneCommunications/linphone-android.git --recursive 如果由于被墙而不能下载,或者网络问题中途断掉了,可以使用 git submodule update --recursive 接着传送没传的submodule. 如果有submodule被墙了,则可以先再codingnet上导入一个公开项目,这样下载codingnet上的项目:或者