项目模块管理第一式 - git submodule

2,651 阅读3分钟

前排

  • 概念 :git-submodule 是 git一个管理共同类库的工具,使得一个项目的自完备子模块能够自我升级和管理。而主模块只需实时去统一更新即可。

    经验谈:为什么突然研究这个呢?应该目前项目是 Swift 写的,用的是 cocoapod 管理。 之前的想法就是 cocoapod 用来导入 swift 库,一些 OC 框架或私有库都是直接拉代码进去的,每次框架升级的时候都要将升级的代码替换掉旧版本的代码。 所以就想研究这个自由度比较高的管理类库的工具,发现当前还是比较符合自己的要求。

操作

  1. 添加

    • 命令 git submodule add {git repository url}

    • 配置

      1.cd MyProject 到自己目录下
      2.mkdir Frameworks 创建一个存放子模块的目录(这一步可忽略)
      3.git submodule add {git repository url} 添加相关的模块,这时相关的框架就被添加到主项目中
      4.将相关模块的文件夹中 submodule.xcodeproj 拉到主项目中。
        到相关路径下配置依赖 Targets -> mainModule -> Build Phases -> Target Dependencies -> 点击 + 进行添加,下面上图。
      5.在用到模块直接 import 就可以使用了
      

      操作

  2. 更新

    • 当将项目提交 git 上时,并不会将已下载的主模块代码上传。所以不管是第一次从 git 上拉取代码下来,还是每次拉取更新都要执行以下代码进行更新和下载 主模块,这里一些人的习惯可能会出现一些坑,详情参见下面唐巧前辈的文章。

    • 命令

      • git submodule init
      • git submodule update
  3. 删除

    • 在要知道怎么删除之前, 知道 git submodule add 这个代码到底做了那些事情, 会更好理解一点。

      • 如果第一次运行该代码的话,会生成一个 .gitmodules,并且将库的信息配置添加进去,如果不是第一次就直接在 .gitmodules 添加新的子模块的信息

        [submodule "Frameworks/Kingfisher"]
        	path = Frameworks/Kingfisher
        	url = https://github.com/onevcat/Kingfisher.git
        [submodule "Frameworks/Alamofire"]
        	path = Frameworks/Alamofire
        	url = https://github.com/Alamofire/Alamofire.git
        
      • 会在 git submodule add 运作的目录下拉取子模块的代码,比如上面是在 MyProject/Framesworks 下 生成 Kingfisher 文件夹并拉取代码

      • 会在 .git/modules 的目录下生成子模块相对应的文件夹,并放置一些 git 相关的信息文件。

    • 删除步骤

      1.git submodule deinit -f submodule 将子模块从主模块中脱离出来。
        注意自己只是脱离,并没有完成删除,如果你还想恢复的话,可以直接通过上面更新的两条命令找回来。
      2.git rm --cached submodule 将对应的缓存删除
      3.rm -rf submodule 删除脱离后留下的文件夹
      4.rm -rf .git/modules/submodule 删除子模块的 git 信息
      5.把 .gitmodules 中的信息删除
      6.把项目中子模块的依赖删除,删除路径见👆添加步骤
      
      
    • 由于我也是刚开始用,而且都是一个人用的,所以目前没遇到什么坑。但我查资料的过程中看到唐巧前辈的文章,里面提示了需要注意的一些点。大家可以参考一下。
  4. 批处理

    • 我在查询资料的时候好像没找到可以像 cocoapod 那样直接利用多个库的连接配置文件,通过一条命令添加多个库和删除多个库的方法。可能如果要做就需要自己写脚本吧。不知道有没哪位熟悉这模块的有相关方法的,如果有的话请指教。

总结:

​ 特点:经过一番实验后发现,相对比与 cocoapod 的来说管理的自由度高,但是操作比较繁琐, 目前没找到什么好的批处理管理方法。目前打算用来管理自己的私有库或者一些 OC 库。

资源