“Git:子模块”的版本间差异

来自Wikioe
跳到导航 跳到搜索
第31行: 第31行:
git submodule update --init --recursive
git submodule update --init --recursive
</syntaxhighlight>
</syntaxhighlight>
# 更新子模块
# 更新子模块:
#: 默认会尝试更新所有子模块,所以如果有很多子模块的话,你可以传递想要更新的子模块的名字
#: 如果子模块有嵌套的子模块,则应使用 --recursive 选项
#: <syntaxhighlight lang="bash">
#: <syntaxhighlight lang="bash">
# (适用于git 1.8.2及以上版本)
# (适用于git 1.8.2及以上版本)
git submodule update --recursive --remote
git submodule update --remote
 
#(适用于git 1.7.3及以上版本)
#(适用于git 1.7.3及以上版本)
git submodule update --recursive
git submodule update
# 或者
</syntaxhighlight>
#: 或者,使用pull命令拉取子模块
#: <syntaxhighlight lang="bash">
git pull --recurse-submodules
git pull --recurse-submodules
</syntaxhighlight>
# 若子模块的 URL 发生了改变(如,子模块项目改变了它的托管平台):
#: <syntaxhighlight lang="bash">
# 将新的 URL 复制到本地配置中
$ git submodule sync --recursive
# 从新 URL 更新子模块
$ git submodule update --init --recursive
</syntaxhighlight>
</syntaxhighlight>



2020年10月14日 (三) 17:17的版本


关于submodule

可以使用 git submodule --help 查看所有相关命令。

git clone <repository> --recursive  //递归的方式克隆整个项目
git submodule add <repository> <path> //添加子模块
git submodule init //初始化子模块
git submodule update //更新子模块
git submodule foreach git pull  //拉取所有子模块

拉取submodule

当一个 git 项目包含子模块(submodule) 时,直接克隆下来的子模块目录里面是空的。有两种方法解决:

  1. 如果项目已经克隆到了本地,执行下面的步骤:
    1. 初始化本地子模块配置文件:
      git submodule init
      
    2. 更新项目,抓取子模块内容:
      git submodule update
      
  2. 对于未克隆项目,使用“--recursive”参数,可以自动初始化并更新每一个子模块。
    git clone --recursive 仓库地址
    

Note:

  • “--recursive”,用于的嵌套(项目中的子模块,子模块中的子模块)。
  1. 对于仓库首次拉取模块,可以使用:
    git submodule update --init --recursive
    
  2. 更新子模块:
    默认会尝试更新所有子模块,所以如果有很多子模块的话,你可以传递想要更新的子模块的名字
    如果子模块有嵌套的子模块,则应使用 --recursive 选项
    # (适用于git 1.8.2及以上版本)
    git submodule update --remote
    #(适用于git 1.7.3及以上版本)
    git submodule update
    
    或者,使用pull命令拉取子模块
    git pull --recurse-submodules
    
  3. 若子模块的 URL 发生了改变(如,子模块项目改变了它的托管平台):
    # 将新的 URL 复制到本地配置中
    $ git submodule sync --recursive
    # 从新 URL 更新子模块
    $ git submodule update --init --recursive
    

添加submodule

关联项目子模块:

git submodule add https://github.com/test/subb.git modules/subb

项目根目录下有一个.gitmodules文件,即子模块关联文件,如:

[submodule "modules/suba"]
    path = modules/suba
    url = https://github.com/test/suba.git

每添加一个子模块就会新增一条记录,如果是第一次添加Git子模块会自动生成。

编辑submodule

切换子模块到开发分支,如:

cd modules/subb/
git checkout -b feature/some-change origin/dev

进行修改

推送submodule

推送子模块修改到远程,如:

git commit -am 'test commit submodule'
git checkout dev
git merge feature/some-change
git push origin dev
git branch -d feature/some-change


提交子模块修改之后,主项目会有一些修改:

cd ../../
git diff
>   diff --git a/subb b/subb
    index 433859c..b78179a 160000
    --- a/subb
    +++ b/subb
    @@ -1 +1 @@
    -Subproject commit 433859c90e539d2a1b9fda27b32bef0d0acae9e6
    +Subproject commit b78179adab252a524ff2a41d6407a7daa6dad34f

此时需要提交主项目该修改,才能在其他用户使用git submodule update时拉取新的代码:

git commit -am "test commit submodule"
git push origin dev

删除submodule

git没有直接删除子模块的命令,所以只能逐步删除相关文件。

  1. 在版本控制中删除子模块:
    git rm -r modules/subb
    
  2. 在编辑器中删除如下相关内容,也可以使用命令“vi .gitmodules”在vim中删除:
    [submodule "modules/subb"]
        path = modules/subb
        url = https://github.com/test/subb.git
        branch = dev
    
  3. 在编辑器中删除如下相关内容,也可以使用命令“vim .git/config”在vim中删除:
    [submodule "modules/subb"]
        path = modules/subb
        url = https://github.com/test/subb.git
        active = true
    
  4. 删除.git下的缓存模块:
    rm -rf .git/modules/subb
    
  5. 提交修改:
    git commit -am "delete subb"
    git push origin dev
    

发布项目