git子模块项目开发指南

一、从远程仓库中克隆到本地(带有子模块)
git clone –recurse-submodules 父仓库地址
如:

1
git clone --recurse-submodules "ssh://1016739@10.10.1.127:29418/app/android/Platin_ElderCare" && scp -p -P 29418 1016739@10.10.1.127:hooks/commit-msg "Platin_ElderCare/.git/hooks/"

如果忘记加–recurse-submodules,可以在clone后执行

1
2
git submodule init // 初始化子模块
git submodule update // 更新子模块与主仓库中的子模块代码同步

或者

1
git submodule update --init

嵌套的(子仓库中包含子仓库)

1
git submodule update --init --recursive
  • 如果修改了.gitmodules,要先执行同步
    1
    git submodule sync

二、添加一个新的子模块,并指定分支,默认master

1
git submodule add -b <分支名> <仓库地址> <本地路径>

三、修改子模块的代码(如同一般项目的处理)

1
2
git add .
git commit -m "提交信息"

四、在主项目中更新子模块

1
2
3
git submodule update // 与主仓库中的子模块代码同步
git submodule update --remote // 与子仓库中代码同步(同步所有的子模块)
git submodule update --remote xxx // 指定需要同步的子模块

注意:如果需要改动子模块的代码才能满足功能的话,要先在子模块的独立项目中修改代码,提交后再到主项目中更新同步

五、仅更新主项目,不自动更新子模块

1
git pull --no-recurse-submodules

六、修改需要同步的子模块分支(根据不同项目的需要更新不同的分支)

1
git config -f .gitmodules submodule.[submodule-name].branch [branch-name]

修改后的.gitmodules如下:
[submodule “mysub”]
path = sub
url = ../sub/.git
branch = develop

七、删除子仓库

  • 反初始化
    1
    git submodule deinit -f <子模块>
  • 删除.gitsubmodule里相关部分
  • 删除.git/config 文件里相关字段
  • 删除子仓库目录。
  • git rm –cached <本地路径>

举例:

  1. 删除子模块:

    1
    2
    3
    git submodule deinit -f -- path/to/submodule
    git rm -f path/to/submodule
    rm -rf .git/modules/path/to/submodule
  2. 重新添加子模块:

    1
    2
    git submodule add [ -b <branch> ] <新的子模块URL> path/to/submodule
    git submodule update --init --recursive
  3. 提交更改:

    1
    2
    3
    4
    git add .gitmodules
    git add path/to/submodule
    git commit -m "Re-add submodule with new URL"
    git push