git 子模块

为了方便各个子模块独立开发,或使用第三方不断更新的仓库,可以使用子模块来引用.
子模块对应的源码是子模块仓库的克隆.

git submodule 与 subtree对比

  1. git submodule
  • 允许其他的仓库指定以一个commit嵌入仓库的子目录
  • 仓库 clone下来需要 init 和 update
  • 会产 .gitmodule 文件记录 submodule 版本信息
  • git submodule 删除起来比较费劲
  1. git subtree
  • 避免以上问题
  • 管理和更新流程比较方便
  • git subtree合并子仓库到项目中的子目录。不用像submodule那样每次子项目修改了后要init和update 。万一哪次没update就直接add . 将.gitmodule 也 commit上去就悲剧了
  • git v1.5.2以后建议使用git subtree

用法

假设P1项目、P2项目共用S项目
1) 关联Subtree
要求working tree是clean的,可以通过git status查看,如果没有staged的东西则可以进行subtree操作.

cd P1项目的路径
git subtree add --prefix=<S项目的相对路径> <S项目git地址> <分支> --squash
解释:--squash意思是把subtree的改动合并成一次commit,这样就不用拉取子项目完整的历史记录。--prefix之后的=等号也可以用空格。
执行这一步时,会clone该子项目的代码到本地,此时通过git log可以查看到如下类似日志:

Squashed 'extern/darknet/' content from commit cdf3200

    git-subtree-dir: extern/darknet
    git-subtree-split: cdf32005c1cf5600be56fe4b35bc1dddc9173b7a

然后执行git push操作更新到远程,commit日志如下:

 Merge commit '34ecafc2a199a9fd3d7ae1facd831156ebc1f860' as 'extern/darknet'

2) 更新代码
P1、P2项目里各种提交commit,其中有些commit会涉及到S目录的更改,但是没关系

3) 提交更改到子项目

cd P1项目的路径
git subtree push --prefix=<S项目的相对路径> <S项目git地址> <分支>

Git 会遍历步骤2中所有的commit,从中找出针对S目录的更改,然后把这些更改记录提交到S项目的Git服务器上,并保留步骤2中的相关S的提交记录到S仓库中
4) 更新子目录

cd P2项目的路径
git subtree pull --prefix=<S项目的相对路径> <S项目git地址> <分支> --squash

转载于:https://www.cnblogs.com/makefile/p/git-submodule.html

<think>我们正在处理关于重命名Git子模块的问题。根据用户的问题,他们想要重命名一个已存在的Git子模块。然而,Git本身并没有直接提供`git submodule rename`这样的命令。因此,我们需要通过一系列步骤来实现重命名子模块的目的。 步骤概述: 1. 修改子模块的路径(即在父仓库中的目录名)。 2. 更新.gitmodules文件中的子模块路径。 3. 将修改后的.gitmodules文件提交到父仓库。 4. 更新子模块的远程URL(如果需要的话,但用户的问题主要是重命名,所以可能不需要改URL)。 但是,请注意,重命名子模块实际上就是改变它在父仓库中的路径。我们不需要改变子模块仓库本身的名称(即远程仓库的名称),而是改变它在父仓库中的目录名称。 具体步骤: 1. **修改子模块路径**: - 使用`git mv`命令来重命名子模块的目录。例如,将子模块从`old-name`重命名为`new-name`: ```bash git mv old-name new-name ``` 2. **更新.gitmodules文件**: - 编辑`.gitmodules`文件,将子模块对应的`path`设置从`old-name`改为`new-name`。 - 如果子模块的URL也需要更改,那么同时修改`url`项。但根据问题,我们只重命名路径,所以通常不需要修改URL。 3. **同步配置**: - 运行`git submodule sync`命令,将更新后的URL和路径同步到.git/config文件中(如果修改了URL的话)。如果只修改了路径,这一步可能不是必须的,但为了确保配置正确,可以执行。 4. **提交更改**: - 将修改后的.gitmodules文件和重命名的目录提交到父仓库: ```bash git add .gitmodules git add new-name # 如果重命名后目录内容有变化(比如子模块指针),但实际上这里我们只是移动了目录,所以通常只需要添加移动后的目录 git commit -m "Rename submodule from old-name to new-name" ``` 5. **更新子模块的工作目录**: - 由于我们移动了子模块的目录,所以需要确保子模块的工作目录也相应地更新位置。通常,在父仓库中执行子模块更新命令: ```bash git submodule update --init --recursive ``` 或者,如果已经初始化过,可以重新初始化: ```bash git submodule deinit old-name git submodule init new-name git submodule update ``` 注意:如果其他协作者拉取了这个更改,他们可能需要运行`git submodule sync --recursive`来更新他们的本地配置,然后运行`git submodule update --init --recursive`来重新初始化子模块。 引用说明: - 关于子模块的基本操作,如添加、初始化、更新,可以参考引用[2]和[4]。 - 关于子模块的配置和提交,参考引用[5]。 - 关于子模块的分支管理,引用[3]提供了一种方法,但在这个问题中我们不需要改变分支。 因此,针对用户的问题“重命名git子模块”,我们给出上述步骤。 相关问题: 1. 如何从父仓库中移除一个子模块? 2. 如何更改子模块的远程仓库URL? 3. 当重命名子模块后,如何解决其他协作者同步时可能出现的问题?</think>### Git子模块重命名步骤 在Git中没有直接的`git submodule rename`命令,但可通过以下步骤实现子模块重命名: 1. **修改子模块路径** 使用`git mv`命令重命名子模块目录: ```bash git mv <旧路径> <新路径> ``` 2. **更新.gitmodules配置** 编辑`.gitmodules`文件,修改对应子模块的`path`值: ```ini [submodule "<新路径>"] path = <新路径> url = https://github.com/user/repo.git ``` 3. **同步配置到本地** 使修改生效: ```bash git submodule sync --recursive ``` 4. **提交变更** 将修改提交到主仓库: ```bash git add .gitmodules <新路径> git commit -m "重命名子模块: <旧路径> → <新路径>" ``` 5. **更新子模块工作目录**(可选) 若需要重新初始化子模块: ```bash git submodule deinit <旧路径> git submodule update --init --recursive <新路径> ``` > **注意事项**: > 1. 重命名后需通知所有协作者运行`git submodule sync --recursive` > 2. 子模块内部仓库名称不受此操作影响 > 3. 如果子模块有未提交更改,需先暂存(`git stash`)或提交 [^1]: 引用[4]提供了子模块添加的基本流程 [^2]: 引用[2]说明了子模块的独立性 [^3]: 引用[3]展示了分支管理方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值